1. ホーム
  2. mysql

[解決済み] SQLクエリです。テーブルから最新のN件を除くすべてのレコードを削除しますか?

2023-01-12 13:11:07

質問

テーブルからすべてのレコードを削除するために、単一の mysql クエリ (変数なし) を構築することは可能でしょうか。

このようなもの、それが動作しないだけ:)。

delete from table order by id ASC limit ((select count(*) from table ) - N)

ありがとうございます。

どのように解決するのですか?

その方法ではレコードを削除することはできません。主な問題は、LIMIT 句の値を指定するためにサブクエリを使用することができないことです。

これは動作します(MySQL 5.0.67 でテスト済み)。

DELETE FROM `table`
WHERE id NOT IN (
  SELECT id
  FROM (
    SELECT id
    FROM `table`
    ORDER BY id DESC
    LIMIT 42 -- keep this many records
  ) foo
);

中間サブクエリ が必要です。これがないと、2つのエラーに遭遇することになります。

  1. SQLエラー(1093)。FROM句で更新対象のテーブル'table'を指定することはできません。 - MySQL は、直接サブクエリ内から削除するテーブルを参照することを許可していません。
  2. SQL エラー (1235)。このバージョンの MySQL は 'LIMIT & IN/ALL/ANY/SOME サブクエリ' をまだサポートしていません。 - NOT IN 演算子の直接サブクエリ内で LIMIT 句を使用することはできません。

幸いなことに、中間サブクエリを使用することで、これらの制限を両方とも回避することができます。


Nicole は、このクエリが特定のユースケース (このようなケース) に対して大幅に最適化されることを指摘しています。以下を読むことをお勧めします。 その答え を読んで、自分に当てはまるかどうかを確認することをお勧めします。