我有4個表:如何修復引用多個表的列?
ConditionalOffer
(PK ID,描述,...)UnconditionalOffer
(PK ID,描述,...)Offer
(PK ID, 優惠外鍵參考ConditionalOffer.ID, 向外國KEY參考UnconditionalOffer.ID)Applicant
(ID,向外國KEY參考Offer.ID,...)
我知道我的代碼在表Offer
錯誤,因爲一列不能引用多個表。我怎樣才能解決這個問題?
我有4個表:如何修復引用多個表的列?
ConditionalOffer
(PK ID,描述,...)UnconditionalOffer
(PK ID,描述,...)Offer
(PK ID, 優惠外鍵參考ConditionalOffer.ID, 向外國KEY參考UnconditionalOffer.ID)Applicant
(ID,向外國KEY參考Offer.ID,...)我知道我的代碼在表Offer
錯誤,因爲一列不能引用多個表。我怎樣才能解決這個問題?
列可以是多個外鍵約束的一部分,但是當您指定源列兩次時,您的語法不正確。
相反無論是使用內聯這樣的約束:
create table Offer (
ID int primary key,
Offer int
FOREIGN KEY (offer) REFERENCES ConditionalOffer (ID),
FOREIGN KEY (offer) REFERENCES UnconditionalOffer (ID)
);
或者使用明確命名的約束(這可能是清潔劑):
create table Offer (
ID int primary key,
Offer int,
constraint fk_cond FOREIGN KEY (offer) REFERENCES ConditionalOffer (ID),
constraint fk_uncond FOREIGN KEY (offer) REFERENCES UnconditionalOffer (ID)
);
雖然這是可能的,但它確實提高對問題數據庫設計:ConditionalOffer和UnconditionalOffer中的ID是否真的一樣?他們如何保持同步?這些表不應該是一個實體,如果它們共享主鍵(重構其他表的差異)?
但是,當我將價值插入'提供'表中,它如何知道Condi或Uncondi表之間的選擇。例如'INSERT INTO OFFER(id,offer)VALUES(1,2)' –
它不能。這是一個很好的跡象表明這種設計可能存在缺陷。如果您有一個與多個表具有外鍵關係的列,則您插入的值必須存在於所有引用的表中,並且您無法知道該提議是否真是ConditionalOffer或UnconditionalOffer。我的猜測是,你真正想要的是執行一條規則,聲明一個優惠必須是優惠類型之一,但不能同時進行。如果我是你,我會重新考慮數據庫模型。 – jpw
哪種RDBMS適用於?請添加一個標籤來指定您是使用'mysql','postgresql','sql-server','oracle'還是'db2' - 或者其他的東西。 –
對不起,我是SQL和stackoverflow的新手。下次我會關注。謝謝! –
一列可以包含在幾個FK中。 – jarlh