我想在table1到table2中的另一个字段的两个组合字段中放置约束,检查或外键。这是我尝试过的,但都给了我错误:
ALTER TABLE table1
ADD CONSTRAINT foo CHECK (field1 || field2 IN (SELECT fieldx FROM table2));
ALTER TABLE table1
ADD CONSTRAINT foo FOREIGN KEY (field1 || field2) REFERENCES table2 (fieldx);
这可能吗?如果有,怎么样?除此之外,通常可以在CHECK约束中使用子选择吗?
我正在使用DB2 / LINUX 9.5.0。
解决方案:
似乎只有一个额外的列才能保持组合值。好的是,Tony Andrews指出,有一种方法可以在DB2中创建表达式生成的列。
CREATE TABLE table1 (
field1 CHARACTER(5),
field2 CHARACTER(5),
fieldx CHARACTER(10) GENERATED ALWAYS AS (field1) || field2),
CONSTRAINT FK_X FOREIGN KEY (fieldx) REFERENCES table2 (fieldx)
);
答案 0 :(得分:0)
一种可能性是在table1上保留一个计算列,即
fieldx = (field1 || field2)
我不知道DB2是否支持计算(也称为虚拟)列,但如果不支持,则可以创建常规列并通过触发器维护它。创建外键约束:
ALTER TABLE table1
ADD CONSTRAINT foo FOREIGN KEY (fieldx) REFERENCES table2 (fieldx);
当然,另一种可能性是修改你的表设计,使得键保持一致:如果field1和field2是原子值,那么它们应该在table2中显示,而不是作为连接值(更多或更多)少休息1NF)。
答案 1 :(得分:0)
如果没有,外键必须与父键具有相同的列数,还要考虑键需要索引,因此请将它们视为“查找”。
对于一个FK到一个PK:
ALTER TABLE table1
ADD FOREIGN KEY (fk1)
REFERENCES table2 (key1) ON DELETE RESTRICT
如果表2上的键是复合键(key1,key2)
ALTER TABLE table1
ADD FOREIGN KEY (fk1,fk2)
REFERENCES table2 (key1,key2) ON DELETE RESTRICT
答案 2 :(得分:0)
尝试添加3个约束:field1和field2有2个可空的外键,以及只有两个中的一个不为空的约束。
当然,你可以放松约束并省略最后一个。