Vous ne pouvez pas supprimer les enregistrements de cette façon, le principal problème étant que vous ne pouvez pas utiliser une sous-requête pour spécifier la valeur d'une clause LIMIT.
Cela fonctionne (testé dans 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
);
La sous-requête intermédiaire est obligatoire. Sans cela, nous rencontrions deux erreurs :
- Erreur SQL (1093) :vous ne pouvez pas spécifier la table cible 'table' pour la mise à jour dans la clause FROM - MySQL ne vous permet pas de faire référence à la table que vous supprimez dans une sous-requête directe.
- Erreur SQL (1235) :cette version de MySQL ne prend pas encore en charge la sous-requête "LIMIT &IN/ALL/ANY/SOME" - Vous ne pouvez pas utiliser la clause LIMIT dans une sous-requête directe d'un opérateur NOT IN.
Heureusement, l'utilisation d'une sous-requête intermédiaire nous permet de contourner ces deux limitations.
Nicole a souligné que cette requête peut être optimisée de manière significative pour certains cas d'utilisation (comme celui-ci). Je recommande de lire cette réponse aussi pour voir si ça te va.