如何对两个组合字段设置约束?

时间:2009-11-17 09:55:14

标签: sql db2

我想在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)

);

3 个答案:

答案 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个可空的外键,以及只有两个中的一个不为空的约束。

当然,你可以放松约束并省略最后一个。