代码之家  ›  专栏  ›  技术社区  ›  Tim Büthe

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

  •  0
  • Tim Büthe  · 技术社区  · 15 年前

    我想在表1中的两个组合字段和表2中的另一个字段之间设置一个约束、一个检查或一个外键。以下是我尝试过的,但都给了我错误:

    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);
    

    这可能吗?如果是,如何进行?除此之外,通常是否可以在检查约束中使用子选择?


    似乎只有使用一个额外的列才能保存组合的值。好的是, 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 回复  |  直到 7 年前
        1
  •  0
  •   Tony Andrews    15 年前

    一种可能性是在表1中保留一个计算列,即。

    fieldx = (field1 || field2)
    

    我不知道DB2是否支持计算(也称为虚拟)列,但如果不支持,您可以创建一个常规列并通过触发器维护它。要创建外键约束,请执行以下操作:

    ALTER TABLE table1
        ADD CONSTRAINT foo FOREIGN KEY (fieldx) REFERENCES table2 (fieldx);
    

        2
  •  0
  •   Damir Sudarevic    15 年前

    如果不是,外键必须有与父键相同的列数,也考虑键需要索引,因此将它们视为“查找”。

    对于一个FK到一个PK:

    ALTER TABLE table1
       ADD FOREIGN KEY (fk1)
         REFERENCES table2 (key1) ON DELETE RESTRICT
    

    如果表2上的键是复合键(键1、键2)

    ALTER TABLE table1
       ADD FOREIGN KEY (fk1,fk2)
         REFERENCES table2 (key1,key2) ON DELETE RESTRICT
    
        3
  •  0
  •   Victor Sergienko    15 年前

    尝试添加3个约束:field1和field2的2个可为null的外键,以及两个外键中只有一个不为null的约束。

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