我有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
?
我有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
?
在我看来,你试图使用某种形式的超类型/子类型的 - 如与简单的垂直分区相反。如果是这样,请引入一个类型鉴别器。因为这是一个通用的例子(A,B,C,D ..)很难猜出什么与什么有关,所以这里有两个选项是我最好的猜测。
选项1
选项2
你可以使用一个check
约束来强制执行D
只引用B
或C
:
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
)
);
但我想它是指B或C,而不是它们两个(并且我不认为每行中的空fk是有效的。 –
在你的方式或独特的表中是否更好? A(ida,...,where)'?我刚刚做了2个月的“sql/mysql课程”,我们并没有做太多的事情,所以我一直在想这样做,然后在网站上我在做我可以检查哪里必须是B或C,然后我可以检查触发器,如果我插入E与E生D –
触发器是邪恶的,我会远离它们。键通常比“类型”列更好,因为类型列重复了外键中的信息 – Andomar
什么是'A'的意义是什么? “B”,“C”和“D”是否继承它? 'E'是否也需要继承它,并且你描述的关系与继承完全无关,或者需要从'B'或'C'继承(或者甚至是相反的方向)? –