その方法でレコードを削除することはできません。主な問題は、サブクエリを使用して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つのエラーが発生します。
- SQLエラー(1093):FROM句で更新するターゲットテーブル'table'を指定できません --MySQLでは、直接サブクエリ内から削除するテーブルを参照することはできません。
- SQLエラー(1235):このバージョンのMySQLは、「LIMIT&IN / ALL / ANY/SOMEサブクエリ」をまだサポートしていません -NOTIN演算子の直接サブクエリ内でLIMIT句を使用することはできません。
幸い、中間サブクエリを使用すると、これらの制限の両方を回避できます。
Nicoleは、このクエリは特定のユースケース(このようなもの)に対して大幅に最適化できると指摘しています。 その回答 を読むことをお勧めします 自分に合っているかどうかも確認してください。