我有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'繼承(或者甚至是相反的方向)? –