小编典典

SQLite:如何根据时间戳限制行数?

sql

我成功使用以下BEFORE INSERT触发器来限制存储在SQLite数据库表 位置中 的行数。数据库表充当Android应用程序中的缓存。

CREATE TRIGGER 'trigger_locations_insert'
BEFORE INSERT ON 'locations'
WHEN ( SELECT count(*) FROM  'locations' ) > '100'
  BEGIN
    DELETE FROM 'locations' WHERE '_id' NOT IN
    (
      SELECT '_id' FROM 'locations' ORDER BY 'modified_at' DESC LIMIT '100' 
    );
  END

同时,我添加了第二个触发器,使我可以INSERT OR UPDATE行。-关于该主题的讨论可以在另一个主题中找到。第二个触发器需要一个VIEW在其INSERT上执行的触发器。

CREATE VIEW 'locations_view' AS SELECT * FROM 'locations';

由于INSERT不再在TABLE 位置 上执行,而是在VIEW locations_view
上执行,因此上述触发器不再起作用。如果我将触发器应用于VIEW以下错误消息。

Failure 1 (cannot create BEFORE trigger on view: main.locations_view)

问题:

如何更改上述触发器以INSERTVIEW-上观察每个触发器,或者您是否建议另一种限制行数的方法?我宁愿在数据库中处理这种操作,而不是在客户端上运行前端代码。


性能问题:

虽然,限制器(上面的触发器)总体上起作用-它的性能低于最佳效果!实际上,数据库操作花费了很长时间,因此引发了ANR。据我所看到的,其原因是,该限制器被称为

一个时间INSERT发生。为了优化设置,INSERT应将大宗交易包装成一个事务,然后限制器应立即执行。这可能吗?


阅读 369

收藏
2021-03-23

共1个答案

小编典典

这种触发器应与其他触发器一起正常工作。问题似乎是SQL不必要地引用了该_id字段。它为每一行选择文字字符串“
_id”,并将其与相同的文字字符串进行比较。

删除引号'_id'DELETE和子引号中SELECT)都可以解决此问题。

2021-03-23