sql >> Database >  >> RDS >> Mysql

SQL-query:verwijder alle records uit de tabel behalve de laatste N?

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:

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



  1. Wanneer geclusterde of niet-geclusterde indexen gebruiken in SQL Server?

  2. MySQL-substringextractie met scheidingsteken

  3. Beste benaderingen voor het uitvoeren van totalen - bijgewerkt voor SQL Server 2012

  4. Wat is het tegenovergestelde van GROUP_CONCAT in MySQL?