SQL约束检查是否在另一个表中输入

时间:2018-03-02 16:20:11

标签: 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
);

OR基于this answer

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

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

3 个答案:

答案 0 :(得分:1)

documentation说:

  

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

答案 1 :(得分:0)

你可以在'person'中为'special'和'snowflake'提供两个外键,并检查只有一个键有值。另一个解决方案可能是将“特殊”和“雪花”加入到一个表中,并检查是否只给出了“技能”或“熔点”中的一个。

答案 2 :(得分:0)

您无法使用 ALTER TABLE 向列中添加 CHECK

您只能使用 ALTER TABLE ADD 列,然后可以 CHECK 约束。 您不能重命名列,也不能删除列。

最简单的方法是在创建表时在列中定义CHECK。如果您有需要保留的数据,则必须: -

  • 1)创建一个新表,
  • 2)将数据从原始数据复制到新表
  • 3)重命名/删除原文和
  • 4)将新表重命名为原始表的名称。