sql >> Databasteknik >  >> RDS >> Mysql

SQL-fråga:Ta bort alla poster från tabellen utom senaste N?

Du kan inte ta bort posterna på det sättet, huvudproblemet är att du inte kan använda en underfråga för att ange värdet på en LIMIT-sats.

Detta fungerar (testat 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 mellanliggande underfrågan är nödvändig. Utan det skulle vi stöta på två fel:

  1. SQL-fel (1093):Du kan inte ange måltabell "tabell" för uppdatering i FROM-satsen - MySQL tillåter dig inte att referera till tabellen du tar bort från en direkt underfråga.
  2. SQL-fel (1235):Den här versionen av MySQL stöder ännu inte 'LIMIT &IN/ALL/NOY/SOME subquery' - Du kan inte använda LIMIT-satsen i en direkt underfråga till en NOT IN-operator.

Lyckligtvis kan vi kringgå båda dessa begränsningar genom att använda en mellanliggande underfråga.

Nicole har påpekat att denna fråga kan optimeras avsevärt för vissa användningsfall (som detta). Jag rekommenderar att du läser det svaret också för att se om den passar din.



  1. 3 sätt att returnera en lista över SQL Server Agent-jobb (T-SQL)

  2. Olika sätt att använda SQL CONVERT date-funktionen

  3. Hur byter man databaser i postgres?

  4. MS-Access basklass och härledda objekt