Anda tidak dapat menghapus catatan dengan cara itu, masalah utamanya adalah Anda tidak dapat menggunakan subkueri untuk menentukan nilai klausa LIMIT.
Ini berfungsi (diuji di 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
);
Subkueri perantara adalah diperlukan. Tanpanya, kami akan mengalami dua kesalahan:
- Kesalahan SQL (1093):Anda tidak dapat menentukan 'tabel' target untuk pembaruan dalam klausa FROM - MySQL tidak mengizinkan Anda untuk merujuk ke tabel yang Anda hapus dari dalam subkueri langsung.
- Kesalahan SQL (1235):Versi MySQL ini belum mendukung 'LIMIT &IN/ALL/ANY/SOME subquery' - Anda tidak dapat menggunakan klausa LIMIT dalam subkueri langsung dari operator NOT IN.
Untungnya, menggunakan subkueri perantara memungkinkan kami melewati kedua batasan ini.
Nicole telah menunjukkan bahwa kueri ini dapat dioptimalkan secara signifikan untuk kasus penggunaan tertentu (seperti yang ini). Saya sarankan membaca jawaban itu juga untuk melihat apakah itu cocok untuk Anda.