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 ステートメント内でネストされたサブクエリを利用することで、行の範囲を正確にターゲットにして削除できます。このアプローチには、次の手順が含まれます。
この回避策を使用して変更されたクエリの例を次に示します。
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 サイトの他の関連記事を参照してください。