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)), ...