SQLite3 递增部分键序列
SQLite3 increment partial key sequence
我正在尝试在 SQLite 中创建一个递增列,以按照它在导入的文本日志中存在的顺序保存信息并按项目分组。
CREATE TABLE log (
row INTEGER PRIMARY KEY AUTOINCREMENT,
item TEXT,
info TEXT
);
使用以下 table,我想相对于 "item" 自动递增 "seq"。
CREATE TABLE test (
item TEXT,
seq INTEGER,
info TEXT,
CONSTRAINT pk_test PRIMARY KEY (item, seq)
);
我尝试了各种 INSERT 并不断遇到 UNIQUE/CONSTRAINT 违规:
INSERT INTO test (item, seq, info)
SELECT item, (SELECT count(item) FROM test t WHERE l.item=t.item) + 1, info
FROM log l;
INSERT INTO test (item, seq, info)
SELECT item, (SELECT COALESCE(MAX(seq),0)+1 FROM test t WHERE l.item=t.item), info
FROM log l;
当我删除 CONSTRAINT 以查看结果时,"seq" 总是以 1 结尾。
问题是您正在计算 test
table 中具有相同 item
值的行,但 table 尚未填充。
只需计算 log
table 中的行数即可。
因为您看到了所有行,但只想要前面的行,所以您必须添加另一个过滤器(如果您没有时间戳之类的东西,请使用 rowid
):
..., (SELECT COUNT(*)
FROM log AS l2
WHERE l2.item = l.item
AND l2.rowid <= l.rowid)), ...
我正在尝试在 SQLite 中创建一个递增列,以按照它在导入的文本日志中存在的顺序保存信息并按项目分组。
CREATE TABLE log (
row INTEGER PRIMARY KEY AUTOINCREMENT,
item TEXT,
info TEXT
);
使用以下 table,我想相对于 "item" 自动递增 "seq"。
CREATE TABLE test (
item TEXT,
seq INTEGER,
info TEXT,
CONSTRAINT pk_test PRIMARY KEY (item, seq)
);
我尝试了各种 INSERT 并不断遇到 UNIQUE/CONSTRAINT 违规:
INSERT INTO test (item, seq, info)
SELECT item, (SELECT count(item) FROM test t WHERE l.item=t.item) + 1, info
FROM log l;
INSERT INTO test (item, seq, info)
SELECT item, (SELECT COALESCE(MAX(seq),0)+1 FROM test t WHERE l.item=t.item), info
FROM log l;
当我删除 CONSTRAINT 以查看结果时,"seq" 总是以 1 结尾。
问题是您正在计算 test
table 中具有相同 item
值的行,但 table 尚未填充。
只需计算 log
table 中的行数即可。
因为您看到了所有行,但只想要前面的行,所以您必须添加另一个过滤器(如果您没有时间戳之类的东西,请使用 rowid
):
..., (SELECT COUNT(*)
FROM log AS l2
WHERE l2.item = l.item
AND l2.rowid <= l.rowid)), ...