从sqlite数据库中删除除最新500行之外的所有行

时间:2012-03-14 15:47:37

标签: ios iphone sqlite delete-row

我的SQL也不错,但iOS上的SQLite不断让我感到高兴。

我有一个表格,我希望将行数限制在500左右,所以当它达到550的触发点时,它将删除最早的50行。

随着时间的推移,id不会始终从1开始,用户可以删除行,因此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

文档说没关系但是失败了。有什么想法吗?

4 个答案:

答案 0 :(得分:5)

保留最新的500条记录:

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

答案 1 :(得分:2)

这些方面的东西,也许?

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

您可以使用id而不是juliandate或任何其他字段,每个插入值都会增加。

答案 2 :(得分: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

答案 3 :(得分: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

相关问题