SQL 约束检查是否在另一个表中的条目

Fel*_*lix 2 sql sqlite constraints

基于整数 ID,如何限制引用公共表的两个表不包含另一个表中已经存在的相同元素?

假设创建了个人信息的基本表:

CREATE TABLE person (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    info VARCHAR(10)
);
Run Code Online (Sandbox Code Playgroud)

然后person创建两个表引用:

CREATE TABLE special (
    id INTEGER PRIMARY KEY,
    skill VARCHAR(10),
    FOREIGN KEY (id) REFERENCES person(id)
);

CREATE TABLE snowflake (
    id INTEGER PRIMARY KEY,
    meltingpoint DECIMAL,
    FOREIGN KEY (id) REFERENCES person(id)
);
Run Code Online (Sandbox Code Playgroud)

但是,我想限制两个表包含同一个人。

所以我认为这样的事情可以解决问题,但是 SQLite3 给出了语法错误(在 CHECK 附近)。

ALTER TABLE special ADD CHECK (
    (SELECT COUNT(*) FROM snowflake WHERE snowflake.id = special.id) = 0
);
Run Code Online (Sandbox Code Playgroud)

或基于此答案

ALTER TABLE special ADD CHECK (
    NOT EXISTS (SELECT 1 FROM snowflake WHERE snowflake.ID = special.ID)
);
Run Code Online (Sandbox Code Playgroud)

这如何实现?我是在做某事还是应该采取完全不同的方法?

CL.*_*CL. 5

文件说:

CHECK 约束的表达式可能不包含子查询。

所以你必须使用trigger s:

CREATE TRIGGER no_snowflake_if_special
AFTER INSERT ON snowflake
WHEN EXISTS (SELECT * FROM special WHERE id = NEW.id)
BEGIN
    SELECT RAISE(FAIL, "a special with the same ID already exists");
END;

-- same for special
Run Code Online (Sandbox Code Playgroud)