sql >> Database teknologi >  >> RDS >> Mysql

SQL-forespørgsel:Slet alle poster fra tabellen undtagen seneste N?

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:

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



  1. Sådan fungerer STR()-funktionen i SQL Server (T-SQL)

  2. Indstilling af Django til at bruge MySQL

  3. Sådan undslipper du enkelte citater i MySQL

  4. Hvordan undslipper jeg et procenttegn i T-SQL?