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

标签 sql sqlite constraints

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

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

CREATE TABLE person (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    info VARCHAR(10)
);

然后创建两个引用 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)
);

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

所以我认为像这样的东西可以解决问题,但是 SQLite3 给出了语法错误(接近 CHECK)。

ALTER TABLE special ADD CHECK (
    (SELECT COUNT(*) FROM snowflake WHERE snowflake.id = special.id) = 0
);

或基于 this answer

ALTER TABLE special ADD CHECK (
    NOT EXISTS (SELECT 1 FROM snowflake WHERE snowflake.ID = special.ID)
);

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

最佳答案

documentation说:

The expression of a CHECK constraint may not contain a subquery.

所以你必须使用trigger小号:

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

关于SQL 约束检查是否在另一个表中的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49073174/

相关文章:

mysql - 根据表主键从两个表中选择

sql - Powershell SQL 查询结果转换为 XML

c# - SQLite-net 中的名称表

javascript - 如何检索使用 setCustomValidity 设置的错误消息?

SQL 使用触发器进行约束

javascript - 关于node.js中的MySQL模块以及与mySQL数据库的并发连接

mysql - 不确定发生了什么的繁重查询

java - 在java中解密时出错

SQLite3.exe shell 没有成功创建数据库?

html - 输入类型 ="email"的约束验证 API?