【问题标题】:Delete all but latest 500 rows from sqlite database从 sqlite 数据库中删除除最新的 500 行之外的所有行
【发布时间】:2012-03-14 15:47:37
【问题描述】:

我的 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

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

【问题讨论】:

  • 它是如何失败的?错误消息,或者只是不删除任何内容或删除错误的内容?为什么不使用日期字段来删除最旧的 50 个?
  • @NickBull, 1. Sqlite3 对错误并没有那么冗长:Error: near "LIMIT": syntax error2. 可能没有日期字段。
  • @MishaAkovantsev 1. 该错误消息足以看出存在语法错误,而不是错误记录被删除的错误。 2. OP 说“我有一个 juliandate 字段”
  • @NickBull 1. 是的,但对我没有帮助。 2. 是的,完全忽略了它。

标签: ios iphone sqlite delete-row


【解决方案1】:

保留最新的 500 条记录:

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

【讨论】:

  • 恭喜,但这取决于。
【解决方案2】:

大概是这样的吧?

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

您可以使用 id 代替 juliandate 或任何其他值随每次插入而增加的字段。

【讨论】:

  • StackOverflow - 让互联网比色情和小猫更棒 - 感谢 user1096188!
  • 这对我不起作用,而 thecr0w 的答案却是。如果这对您不起作用,请检查一下。
【解决方案3】:
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

【讨论】:

  • 这将每次删除 n 行,但不是“删除所有但最新的 500 行”。我认为这意味着保留最新的 500 条记录。
【解决方案4】:

试试这个。这应该是您正在寻找的:

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

【讨论】:

  • 唉,不,不知道为什么不,但 SQLite 似乎更加狂热。
  • 您的意思是保留最新的 500 条记录吗?
猜你喜欢
  • 2013-06-10
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
相关资源
最近更新 更多