2010-09-08 12 views
17

Ich habe eine Datenbank mit 1000 Datensätzen. Ich versuche eine SQL-Anweisung zu erstellen. Wenn also die Anzahl der Datensätze über 1000 ansteigt, werden die ältesten Datensätze gelöscht (d. H. Die neuen Datensätze über 1000 ersetzen die ältesten Datensätze). Ich benutze SQLite, aber ich nehme an, dass die übliche SQL-Syntax hier passt.Lösche älteste Datensätze aus der Datenbank

+0

Sie können weitere Antworten erhalten, wenn Sie einige Tabellenschemadetails angeben. – serg10

+0

Sie können weitere Informationen angeben. Wie hast du einen Zeitstempel auf den Spalten? Ist die ID eine GUID oder ein Autoinkrement? Was ist Ihr Ziel, um alle älteren X-Datum zu entfernen oder gibt es ein Limit von 1000 Datensätze? oder was ist der Grund für das Löschen dieser Datensätze? Wir können Ihre Frage dann besser beantworten. –

+0

Oh, und was ist dein Primärschlüsselfeld? oder hast du sogar einen? –

Antwort

35

Wenn Sie ein Auto-increment-Feld verwenden, können Sie einfach das schreiben die ältesten 100 Datensätze zu löschen:

DELETE FROM mytable WHERE id IN (SELECT id FROM mytable ORDER BY id ASC LIMIT 100) 

Oder, wenn kein solches Feld vorhanden ist, verwenden ROWID:

DELETE FROM mytable WHERE ROWID IN (SELECT ROWID FROM mytable ORDER BY ROWID ASC LIMIT 100) 

Oder nur die neuesten 1000 Datensätze zu verlassen:

DELETE FROM mytable WHERE ROWID IN (SELECT ROWID FROM mytable ORDER BY ROWID DESC LIMIT -1 OFFSET 1000) 
+1

Danke, aber ich brauchte ein ... Limit -1 Offset 1000 – Seven

+0

Ich dachte darüber nach, dies auch zu verwenden, aber wird MySQL nicht die zuvor gelöschten IDs verwenden, so dass dies nicht mehr funktioniert? Da ID = 1 verfügbar wird, wird eine neuere Zeile mit ID = 1 erstellt und dann zuerst gelöscht. – NaturalBornCamper

1

Unter der Annahme, dass Ihre Tabelle einen Primär hat Key und eine Spalte mit einem Zeitstempel anzeigt, wenn der Datensatz eingefügt wurde), können Sie eine Abfrage nach dem Vorbild der

delete from tableToDeleteFrom 
where tablePK in 
(select tablePK 
from tableToDeleteFrom 
where someThresholdDate <= @someThresholdDate) 
-3

verwenden für alle Datensätze außer dem ersten Datensatz (min/max id) löschen Sie verwenden können:

SET @ls AS INT 

SELECT @ls = MIN(id) FROM DATA 

DELETE FROM DATA WHERE id <> @ls 
+0

Ist es wirklich die Frage beantwortet? – voromax

Verwandte Themen