Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL-Abfrage:Alle Datensätze außer den letzten N aus der Tabelle löschen?

Sie können die Datensätze auf diese Weise nicht löschen, das Hauptproblem besteht darin, dass Sie keine Unterabfrage verwenden können, um den Wert einer LIMIT-Klausel anzugeben.

Das funktioniert (getestet 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
);

Die Zwischenunterabfrage ist erforderlich. Ohne sie würden wir auf zwei Fehler stoßen:

  1. SQL-Fehler (1093):Sie können die Zieltabelle „table“ nicht für die Aktualisierung in der FROM-Klausel angeben - MySQL erlaubt es Ihnen nicht, auf die zu löschende Tabelle innerhalb einer direkten Unterabfrage zu verweisen.
  2. SQL-Fehler (1235):Diese Version von MySQL unterstützt noch nicht die Unterabfrage „LIMIT &IN/ALL/ANY/SOME“ - Sie können die LIMIT-Klausel nicht innerhalb einer direkten Unterabfrage eines NOT IN-Operators verwenden.

Glücklicherweise ermöglicht uns die Verwendung einer Zwischenabfrage, diese beiden Einschränkungen zu umgehen.

Nicole hat darauf hingewiesen, dass diese Abfrage für bestimmte Anwendungsfälle (wie diesen) erheblich optimiert werden kann. Ich empfehle, diese Antwort zu lesen auch um zu sehen, ob es zu Ihrem passt.