这是一个简单的问题。
根据时间戳字段,我在某个表中最多只能有400行,所以旧的行会被自动删除。在这里,我们假设是3行。
这个表有很多字段,但是时间戳是最重要的。
虽然我已经成功了(看 此处),由于某些原因,它让我得到了一个额外物品的最大值,所以我只是相应地调整了它。这意味着,我得到了4个项目,而不是3个。
private const val MAX_ITEMS = 3
private val TIMESTAMP_FIELD = "timestamp"
private val DELETE_FROM_CALL_LOG_TILL_TRIGGER =
String.format(
"CREATE TRIGGER %1\$s INSERT ON %2\$s
WHEN (select count(*) from %2\$s)>%3\$s
BEGIN
DELETE FROM %2\$s WHERE %2\$s._id IN " +
"(SELECT %2\$s._id FROM %2\$s ORDER BY %2\$s.$TIMESTAMP_FIELD DESC LIMIT %3\$d, -1);
END;"
, "delete_till_reached_max", TABLE_NAME, MAX_ITEMS - 1)
我试了一下。
WHEN
(部分)LIMIT %3\$d, -1
到 LIMIT -1 OFFSET %3\$d
. 还试了一个不同于"-1 "的数字(试了0,因为我认为这是额外的)。MAX_ITEMS - 1
而不是仅仅 MAX_ITEMS
? 为什么它让我有4个项目而不是3个?WHEN
那里?是否更好?BEFORE | AFTER
句,所以它 BEFORE
默认情况下。这意味着您正在计算行 之前 插入,而不是在它之后。这个应该可以。
private const val MAX_ITEMS = 3
private val TIMESTAMP_FIELD = "timestamp"
private val DELETE_FROM_CALL_LOG_TILL_TRIGGER =
String.format(
"CREATE TRIGGER %1\$s AFTER INSERT ON %2\$s
FOR EACH ROW
BEGIN
DELETE FROM %2\$s WHERE _id =
(SELECT _id FROM %2\$s ORDER BY %4\$s DESC LIMIT 1 OFFSET %3\$s);
END;"
, "delete_till_reached_max", TABLE_NAME, MAX_ITEMS, TIMESTAMP_FIELD)
一旦表中有400行,你就可以调用触发器,比如说 trg_keep_rowcount_constant
并去除 GROUP BY null HAVING COUNT(*) > %3\$s
从代码中。
演示。https:/dbfiddle.uk?rdbms=sqlite_3.27&fiddle=ea3867e20e85927a2de047908771f4f1。