2010-09-08 129 views
17

我有一個包含1000條記錄的數據庫。 我試圖創建一個SQL語句,所以如果記錄數增長到1000以上,那麼最舊的記錄被刪除(即1000以上的新記錄'替換'最舊的記錄)。 我正在使用SQLite,但我認爲通常的SQL語法將適合在這裏。從數據庫中刪除最舊的記錄

+0

如果包含一些表模式詳細信息,則可能會得到更多答案。 – serg10 2010-09-08 11:29:47

+0

您可能想要提供更多信息。像你有專欄的時間戳嗎?該ID是GUID還是自動增量?您的目標是要刪除所有年齡更大的X日期還是1000條記錄的限制?或刪除這些記錄的原因是什麼?那麼我們可以更好地回答你的問題。 – 2010-09-08 11:31:57

+0

哦,你的主要關鍵字是什麼?或者你甚至有一個? – 2010-09-08 11:32:38

回答

35

如果使用自動遞增字段,你可以很容易地編寫這刪除最早的100條記錄:

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

或者,如果沒有這樣的字段存在,使用ROWID

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

或者,只留下最新的1000條記錄:

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

謝謝,但我需要一個...限制-1抵消1000 – Seven 2013-04-08 18:50:00

+0

我也在考慮使用這個,但不會MySQL使用以前刪除的ID最終所以這不會工作了?由於ID = 1將變爲可用,因此將創建一個ID = 1的較新行,然後將首先刪除該行。 – NaturalBornCamper 2017-06-26 08:42:41

1

假設您的表具有主鍵和時間戳指示何時插入記錄)的列,您可以使用查詢沿

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

行對於刪除所有記錄除第一個記錄(最小/最大編號),可以使用:

SET @ls AS INT 

SELECT @ls = MIN(id) FROM DATA 

DELETE FROM DATA WHERE id <> @ls 
+0

它真的回答了這個問題嗎? – voromax 2013-11-07 21:27:15