2012-03-14 109 views
2

我的SQL並不糟糕,但iOS上的SQLite不斷讓我感覺不到。從sqlite數據庫中刪除除最新500行以外的所有數據

我有一張桌子,我想限制行數到500左右,所以當它碰到550的觸發點時,它會刪除最早的50行。

隨着時間的推移,它不會總是從一開始,用戶可以刪除行,所以ID是非順序的。

我有一個juliandate場(double),但我不知道這是任何使用

DELETE FROM contents WHERE id > '0' ORDER BY id DESC LIMIT 0, 50 
DELETE FROM contents ORDER BY id DESC LIMIT 0, 50 

文件說,這是確定的,但它失敗。有任何想法嗎?

+0

它是如何失敗?錯誤消息,或只是不刪除任何東西或刪除錯誤的東西?爲什麼不使用日期字段,以便刪除最早的50個? – 2012-03-14 16:00:52

+0

@NickBull,'1.' Sqlite3不是關於錯誤的冗長:'錯誤:接近「LIMIT」:語法錯誤'。 '2'可能沒有日期字段。 – 2012-03-14 16:55:47

+0

@MishaAkovantsev 1.該錯誤消息足以證明存在語法錯誤,而不是錯誤記錄被刪除。 2. OP說:「我有一個朱利安場」 – 2012-03-14 21:18:03

回答

1

沿着這些線條的東西,也許?

delete from contents where juliandate <= (
    select max(juliandate) from (
     select juliandate from contents order by juliandate limit 0, 50)); 

您可以使用id而不是juliandate或任何其他字段的值隨每個插入而增加。

+0

StackOverflow - 讓互聯網比色情片和小貓本身更加真棒 - 謝謝你user1096188! – JulianB 2012-03-14 17:38:16

+0

這不適合我,而cr0w的答案是。如果這不適合你,請檢查一下。 – 2014-01-13 20:56:54

0

試試看。這應該是你在找什麼:

DELETE FROM contents WHERE id IN 
    (SELECT id FROM contents ORDER BY id LIMIT 50 ASC); 

讀也,類似的問題:Keep only N last records in SQLite database, sorted by date

+0

唉,不知道爲什麼不,但SQLite似乎更加迷人。 – JulianB 2012-03-14 17:36:14

+0

你的意思是保留最新的500條記錄嗎? – thecr0w 2013-06-28 01:34:20

1
DELETE FROM contents WHERE id IN (SELECT id FROM t ORDER BY id ASC LIMIT 50) 

DESC意味着5,4,3,2,1,用它來刪除the freshest記錄。
ASC表示1,2,3,4,5,用它來刪除the earliest記錄。

下面是一個例子:

$ sqlite3 /tmp/del_rows.sqlite3 
CREATE TABLE t (id INTEGER PRIMARY KEY, value TEXT); 
INSERT INTO t (value) VALUES ('a'); 
INSERT INTO t (value) VALUES ('b'); 
INSERT INTO t (value) VALUES ('c'); 
INSERT INTO t (value) VALUES ('d'); 
INSERT INTO t (value) VALUES ('e'); 
INSERT INTO t (value) VALUES ('f'); 
SELECT * FROM t; 
-- 1|a 
-- 2|b 
-- 3|c 
-- 4|d 
-- 5|e 
-- 6|f 

-- Deleting 2 top rows: 
DELETE FROM t WHERE id IN (SELECT id FROM t ORDER BY id ASC LIMIT 2); 
SELECT * FROM t; 
-- 3|c 
-- 4|d 
-- 5|e 
-- 6|f 

-- And again: 
DELETE FROM t WHERE id IN (SELECT id FROM t ORDER BY id ASC LIMIT 2); 
SELECT * FROM t; 
-- 5|e 
-- 6|f 
+0

這會每次刪除n行,但不是「刪除最近的500行」,這意味着保留最新的500條記錄,我想。 – thecr0w 2013-06-28 01:33:12

3

保持最新的500條記錄:

delete 
from table_name 
where _id not 
    in (select _id 
    from table_name 
    order by 
     _id desc 
    limit 500) 
+1

適用於我,當接受的答案沒有。 Upvoting! – 2014-01-13 20:56:26

+0

恭喜,但它只是取決於。 – thecr0w 2014-01-15 02:05:58

相關問題