外键引用多个表

时间:2012-06-15 08:48:13

标签: sql database-design foreign-keys primary-key vertical-partitioning

我有4张桌子

A(ida, name)
B(ida, B-specific stuff)
C(ida, C-specific stuff)
D(ida, D-specific stuff)

我想要另一个表E只能引用B或C(不是D)。我能在

中写些什么
CREATE TABLE E

2 个答案:

答案 0 :(得分:2)

在我看来,您正在尝试使用某种超类型/子类型 - 而不是简单的垂直分区。如果是这样,请引入类型鉴别器。

因为这是一般的例子(A,B,C,D ..),很难猜出与什么有关,所以这里有两个选项作为我最好的猜测。


选项1

enter image description here


选项2

enter image description here

答案 1 :(得分:1)

您可以使用check约束来强制D仅引用BC

create table D
    (
    id int constraint PK_D primary key,
    idb int constraint FK_D_IDB foreign key references B(id),
    idc int constraint FK_D_IDC foreign key references C(id),
    constraint CHK_D_B_OR_C check 
        (
        case when idb is null then 0 else 1 end + 
        case when idc is null then 0 else 1 end = 1
        )
    );

Live example at SQL Fiddle.