2

我有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 

+0

什么是'A'的意义是什么? “B”,“C”和“D”是否继承它? 'E'是否也需要继承它,并且你描述的关系与继承完全无关,或者需要从'B'或'C'继承(或者甚至是相反的方向)? –

回答

2

在我看来,你试图使用某种形式的超类型/子类型的 - 如与简单的垂直分区相反。如果是这样,请引入一个类型鉴别器。因为这是一个通用的例子(A,B,C,D ..)很难猜出什么与什么有关,所以这里有两个选项是我最好的猜测。


选项1

enter image description here


选项2

enter image description here

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.

+0

但我想它是指B或C,而不是它们两个(并且我不认为每行中的空fk是有效的。 –

+0

在你的方式或独特的表中是否更好? A(ida,...,where)'?我刚刚做了2个月的“sql/mysql课程”,我们并没有做太多的事情,所以我一直在想这样做,然后在网站上我在做我可以检查哪里必须是B或C,然后我可以检查触发器,如果​​我插入E与E生D –

+0

触发器是邪恶的,我会远离它们。键通常比“类型”列更好,因为类型列重复了外键中的信息 – Andomar