基于整数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)
);
如何实现这一目标?我是在做某事还是应采取完全不同的方法?
答案 0 :(得分:1)
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。如果您有需要保留的数据,则必须: -