Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête SQL :Supprimer tous les enregistrements de la table à l'exception du dernier N ?

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 :

  1. 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.
  2. 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.