2010-09-08 16 views
17

Mam bazę danych z 1000 rekordami. Próbuję utworzyć instrukcję SQL, więc jeśli liczba rekordów przekroczy 1000, to najstarsze rekordy zostaną usunięte (tj. Nowe rekordy powyżej 1000 'zastępują' najstarsze rekordy). Używam SQLite, ale zakładam, że będzie tu pasować standardowa składnia SQL.Usuwanie najstarszych rekordów z bazy danych

+0

Możesz uzyskać więcej odpowiedzi, jeśli podasz szczegóły schematu tabeli. – serg10

+0

Możesz chcieć podać więcej informacji. Jak masz znacznik czasu na kolumnach? Czy identyfikator to GUID czy auto increment? jaki jest twój cel, aby usunąć wszystkie starsze niż X daty lub czy istnieje limit 1000 rekordów? lub jaki jest powód usuwania tych rekordów? Możemy lepiej odpowiedzieć na twoje pytanie. –

+0

A co to jest twoje podstawowe pole kluczowe? czy nawet je masz? –

Odpowiedz

35

Jeśli używasz pola automatycznego przyrostu, można łatwo napisać to usunąć najstarsze 100 rekordów:

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

lub, jeśli nie ma takiego pola jest obecny, należy ROWID:

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

Albo zostawić tylko ostatnie 1000 rekordy:

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

Dzięki, ale potrzebowałem ... limitu -1 przesunięcia 1000 – Seven

+0

Myślałem również o użyciu tego, ale czy MySQL nie użyje wcześniej usuniętych identyfikatorów, więc to już nie zadziała? Ponieważ ID = 1 stanie się dostępny, zostanie utworzony nowy wiersz o ID = 1, a następnie zostanie usunięty ...? – NaturalBornCamper

1

Zakładając, że stół ma podstawowy Klucz i kolumna z datownik wskazujący, gdy płyta została włożona), można użyć kwerendy wzdłuż linii

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

Aby usunąć wszystkie rekordy z wyjątkiem pierwszego rekordu (min/max id) można użyć:

SET @ls AS INT 

SELECT @ls = MIN(id) FROM DATA 

DELETE FROM DATA WHERE id <> @ls 
+0

Czy to naprawdę odpowiada na pytanie? – voromax

Powiązane problemy