Не можете да изтриете записите по този начин, основният проблем е, че не можете да използвате подзаявка, за да посочите стойността на клауза 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
);
Междинната подзаявка е задължително. Без него бихме се сблъскали с две грешки:
- SQL грешка (1093):Не можете да посочите целева таблица „таблица“ за актуализиране в клауза FROM - MySQL не ви позволява да се обърнете към таблицата, която изтривате, в рамките на директна подзаявка.
- SQL грешка (1235):Тази версия на MySQL все още не поддържа „LIMIT &IN/ALL/ANY/SOME подзаявка“ – Не можете да използвате клаузата LIMIT в директна подзаявка на оператор NOT IN.
За щастие, използването на междинна подзаявка ни позволява да заобиколим и двете ограничения.
Никол посочи, че тази заявка може да бъде оптимизирана значително за определени случаи на употреба (като този). Препоръчвам да прочетете този отговор както и да видите дали отговаря на вашия.