ホームページ  >  記事  >  データベース  >  DELETE ステートメントで OFFSET を使用せずに MySQL で行の範囲を削除するにはどうすればよいですか?

DELETE ステートメントで OFFSET を使用せずに MySQL で行の範囲を削除するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-25 17:21:02912ブラウズ

How to Delete a Range of Rows in MySQL without Using OFFSET in DELETE Statement?

MySQL で範囲を指定して行を削除する

MySQL で LIMIT 句を使用してテーブルから特定の範囲の行を削除しようとすると、エラーが発生する可能性があります。たとえば、次のクエリは、タイムスタンプの降順で 20 行目から開始して 50 行の範囲を削除することを目的としています。

DELETE FROM `chat_messages` ORDER BY `timestamp` DESC LIMIT 20, 50;

ただし、このクエリを実行すると、次の理由によりエラー メッセージが表示されます。無効な構文、特に OFFSET 値 (50) です。

DELETE ステートメントの LIMIT 句の制限

エラーの根本原因は、使用できないことにあります。 DELETE ステートメントの LIMIT 句の OFFSET。これは、LIMIT と OFFSET の両方で開始点と取得する行数を指定できる SELECT ステートメントとは大きく異なります。

範囲削除の回避策

Toこの制限を回避するには、回避策が必要です。 DELETE ステートメント内でネストされたサブクエリを利用することで、行の範囲を正確にターゲットにして削除できます。このアプローチには、次の手順が含まれます。

  1. 必要な範囲内の行の識別子 (主キーなど) を選択するサブクエリを使用してターゲット行を識別します。このサブクエリでは、正しい範囲が選択されるように行を適切に並べる必要があります。
  2. IN 演算子を使用して、サブクエリを DELETE ステートメントの WHERE 句に組み込みます。これにより、サブクエリによって識別された行のみが削除の対象になります。

この回避策を使用して変更されたクエリの例を次に示します。

DELETE FROM `chat_messages` 
WHERE `id` IN (
    SELECT `id` FROM (
        SELECT `id` FROM `chat_messages`
        ORDER BY `timestamp` DESC
        LIMIT 20, 50
    ) AS `x`
)

このクエリでは、プライマリキー列 ID が想定されますが、特定のシナリオでは適切な列名に変更できます。

以上がDELETE ステートメントで OFFSET を使用せずに MySQL で行の範囲を削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。