ホームページ >データベース >mysql チュートリアル >MySQL で最新の N レコードを除くすべてのレコードを効率的に削除するにはどうすればよいですか?

MySQL で最新の N レコードを除くすべてのレコードを効率的に削除するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-08 16:17:41398ブラウズ

How to Efficiently Delete All but the N Most Recent Records in MySQL?

MySQL: N 個の最新エントリを除くすべてのエントリを削除

データベース管理では、最新のレコードを保持しながら古いレコードを削除する必要があることがよくあります。 これは、変数に依存せずに、賢い SQL クエリを使用して MySQL で実現できます。

よくある、しかし欠陥のある試みは次のとおりです:

<code class="language-sql">DELETE FROM table ORDER BY id ASC LIMIT ((SELECT COUNT(*) FROM table) - N);</code>

このアプローチは、MySQL の DELETE ステートメントの制限により失敗します。

堅牢なソリューションには、ネストされたサブクエリが含まれます。

<code class="language-sql">DELETE FROM `table`
WHERE id NOT IN (
  SELECT id
  FROM (
    SELECT id
    FROM `table`
    ORDER BY id DESC
    LIMIT 42 -- Replace 42 with the number of records to keep (N)
  ) as recent_records
);</code>

ネストされたサブクエリは非常に重要です。 これがないと、次のようなエラーが発生します:

  • SQL エラー (1093): 同じクエリ内から選択しているテーブルを変更することはできません。
  • SQL エラー (1235): LIMIT サブクエリ内で直接 NOT IN を使用することは禁止されています。

この構造化クエリはこれらの制限を効率的に回避し、指定された数の最近のレコード (LIMIT 句で定義) を除くすべてを正常に削除します。 42N の希望の値に置き換えることを忘れないでください。

以上がMySQL で最新の N レコードを除くすべてのレコードを効率的に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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