U kunt de records op die manier niet verwijderen, het belangrijkste probleem is dat u geen subquery kunt gebruiken om de waarde van een LIMIT-clausule op te geven.
Dit werkt (getest in 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
);
De tussenliggende subquery is vereist. Zonder dit zouden we twee fouten tegenkomen:
- SQL-fout (1093):u kunt de doeltabel 'tabel' voor update niet specificeren in de FROM-clausule - MySQL staat u niet toe om te verwijzen naar de tabel die u verwijdert vanuit een directe subquery.
- SQL-fout (1235):deze versie van MySQL biedt nog geen ondersteuning voor 'LIMIT &IN/ALL/ANY/SOME subquery' - U kunt de LIMIT-clausule niet gebruiken binnen een directe subquery van een NOT IN-operator.
Gelukkig stelt het gebruik van een tussenliggende subquery ons in staat om beide beperkingen te omzeilen.
Nicole heeft erop gewezen dat deze zoekopdracht aanzienlijk kan worden geoptimaliseerd voor bepaalde gebruikssituaties (zoals deze). Ik raad aan om dat antwoord te lezen ook om te zien of het bij jou past.