Nie możesz usunąć rekordów w ten sposób, głównym problemem jest to, że nie możesz użyć podzapytania do określenia wartości klauzuli LIMIT.
To działa (testowane w 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
);
Podzapytanie pośrednie jest wymagany. Bez tego napotkalibyśmy dwa błędy:
- Błąd SQL (1093):nie można określić „tabeli” tabeli docelowej do aktualizacji w klauzuli FROM - MySQL nie pozwala na odwoływanie się do usuwanej tabeli z poziomu bezpośredniego podzapytania.
- Błąd SQL (1235):Ta wersja MySQL nie obsługuje jeszcze podzapytania „LIMIT &IN/ALL/ANY/SOME” - Nie możesz użyć klauzuli LIMIT w bezpośrednim podzapytaniu operatora NOT IN.
Na szczęście użycie pośredniego podzapytania pozwala nam ominąć oba te ograniczenia.
Nicole zwróciła uwagę, że to zapytanie można znacznie zoptymalizować pod kątem niektórych przypadków użycia (takich jak ten). Polecam przeczytanie tej odpowiedzi również, aby sprawdzić, czy pasuje do twojego.