我想创建一个具有固定行数的表(比如说 N),如果添加了第 N+1 行,则将删除第 1 行。
这是表格,我用于存储来自图形分析的最后 N 个最佳结果:
CREATE TABLE IF NOT EXISTS lp_registry.best (
value float, // best value for current graph
verts int, // number of vertices in graph
edges int, // number of edges in graph
wid text, // worker id
id timeuuid, // timeuuid
PRIMARY KEY (wid, id)
) WITH CLUSTERING ORDER BY (id ASC);
我在 DataStax 阅读了有关过期数据的信息,但发现只有 TTL 过期。所以我决定按照以下方式进行。
我的方法A:
每次想要添加新结果时,都会检索最旧行的 id。
SELECT wid, id FROM lp_registry.best LIMIT 1;
..以及当前的行数..
SELECT COUNT(*) FROM FROM lp_registry.best;
因此,如果 count >= N,则删除最旧的行并添加最新的行...
BEGIN BATCH
INSERT INTO lp_registry.best (value, verts, edges, wid, id) VALUES (?, ?, ?, ? now());
DELETE FROM lp_registry.best WHERE wid = ? AND id = ?;
APPLY BATCH;
这种方法的问题在于,第一次选择不是原子操作以及随后的批处理。因此,如果任何其他工作人员删除了 select 和 batch 之间最旧的行,或者超过了 N,那么这将不起作用。
我的方法B:
相同的第一步...
SELECT wid, id FROM lp_registry.best LIMIT 1;
SELECT COUNT(*) FROM FROM lp_registry.best;
然后尝试一次又一次地删除最旧的行,直到成功..
if count < N {
INSERT INTO lp_registry.best (value, verts, edges, wid, id) VALUES (?, ?, ?, ? now());
} else {
while not success {
DELETE FROM lp_registry.best WHERE wid = ? AND id = ? IF EXISTS;
}
INSERT INTO lp_registry.best (value, verts, edges, wid, id) VALUES (?, ?, ?, ? now());
}
在这种方法中,在检查 count < N 之前,在数据库中超过 N 仍然存在问题。
你能给我指出正确的解决方案吗?