sqlite - 是否可以在 Sqlite 中的复合 PK 上(模拟?)自动增量?

标签 sqlite auto-increment compound-key

根据SQLite docs ,获得自动增量列的唯一方法是在主键上。

我需要一个复合主键,但我也需要自动递增。有没有办法在 SQLite 中实现这两个目标?

我在 PostgreSQL 中编写的表的相关部分:

CREATE TABLE tstage (
    id                   SERIAL NOT NULL,
    node                 INT REFERENCES nodes(id) NOT NULL,
    PRIMARY KEY (id,node),
    -- ... other columns
);

提出此要求的原因是所有节点最终都会将其数据转储到单个集中节点,在该节点中,如果使用单列 PK,则会发生冲突。

最佳答案

文档是正确的。 但是,可以在触发器中重新实现自动增量逻辑:

CREATE TABLE tstage (
    id    INT,  -- allow NULL to be handled by the trigger
    node  INT REFERENCES nodes(id) NOT NULL,
    PRIMARY KEY (id, node)
);

CREATE TABLE tstage_sequence (
    seq INTEGER NOT NULL
);
INSERT INTO tstage_sequence VALUES(0);

CREATE TRIGGER tstage_id_autoinc
AFTER INSERT ON tstage
FOR EACH ROW
WHEN NEW.id IS NULL
BEGIN
    UPDATE tstage_sequence
    SET seq = seq + 1;

    UPDATE tstage
    SET id = (SELECT seq
              FROM tstage_sequence)
    WHERE rowid = NEW.rowid;
END;

(如果有多个表,则使用通用的 my_sequence 表和表名称。)

关于sqlite - 是否可以在 Sqlite 中的复合 PK 上(模拟?)自动增量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10641004/

相关文章:

database - Django 的复合/复合主/唯一键

python - 在 python 中插入 SQLite 主键

android - 编译时无法启动 Activity ,android.database.sqlite.SQLiteException : no such table,:SELECT * FROM table

android - Android 中的单个内容提供者还是多个内容提供者?

mysql - 获取 PostgreSQL 中所有序列的最大 ID

c++ - 资源中的 Visual Studio 2005 C++ 自动增量版本

iphone - SQLite。不能添加超过 1000 行

mysql - MySQL INSERT .. SELECT 语句的 auto_increment 字段值顺序是什么

mysql - 复合柱上的独特之处