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

Barbara Streisand
リリース: 2024-10-25 17:21:02
オリジナル
911 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!