Du kan ikke slette posterne på den måde, hovedproblemet er, at du ikke kan bruge en underforespørgsel til at angive værdien af en LIMIT-klausul.
Dette virker (testet i 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
);
Den mellemliggende underforespørgsel er påkrævet. Uden det ville vi løbe ind i to fejl:
- SQL-fejl (1093):Du kan ikke angive måltabel 'tabel' til opdatering i FROM-klausul - MySQL tillader dig ikke at henvise til den tabel, du sletter fra en direkte underforespørgsel.
- SQL-fejl (1235):Denne version af MySQL understøtter endnu ikke 'LIMIT &IN/ALL/ANY/SOME underforespørgsel' - Du kan ikke bruge LIMIT-sætningen i en direkte underforespørgsel af en NOT IN-operator.
Heldigvis giver brug af en mellemliggende underforespørgsel os mulighed for at omgå begge disse begrænsninger.
Nicole har påpeget, at denne forespørgsel kan optimeres betydeligt til visse brugssager (såsom denne). Jeg anbefaler at læse det svar også for at se, om den passer til din.