我想创建一个不超过n行数据的SQL表.插入新行时,我希望删除最旧的行以为新行添加空间.
在SQLite中有一种典型的处理方式吗?
应该用一些外部(第三方)代码来管理它吗?
扩大对Alex的答案,假设你有一个递增的,不重复的表上连载专栏t
命名serial
可以用来确定行的相对年龄:
CREATE TRIGGER ten_rows_only AFTER INSERT ON t BEGIN DELETE FROM t WHERE serial <= (SELECT serial FROM t ORDER BY serial DESC LIMIT 10, 1); END;
当你的行数少于10行时,这将无效,而DELETE
当INSERT
你将行数推到11行时,它将是最低的序列.
UPDATE
这是一个稍微复杂的案例,其中您的表记录列中可能包含重复项的行的"年龄",例如TIMESTAMP
跟踪插入时间的列.
sqlite> .schema t CREATE TABLE t (id VARCHAR(1) NOT NULL PRIMARY KEY, ts TIMESTAMP NOT NULL); CREATE TRIGGER ten_rows_only AFTER INSERT ON t BEGIN DELETE FROM t WHERE id IN (SELECT id FROM t ORDER BY ts DESC LIMIT 10, -1); END;
在这里我们理所当然地认为我们不能id
用来确定相对年龄,所以我们删除了按时间戳排序的前10行之后的所有内容.(SQLite对共享相同的行强制执行任意顺序ts
).