2015-11-17 17 views
-1

我有4個表:如何修復引用多個表的列?

  • ConditionalOffer(PK ID,描述,...)
  • UnconditionalOffer(PK ID,描述,...)
  • Offer(PK ID, 優惠外鍵參考ConditionalOffer.ID, 向外國KEY參考UnconditionalOffer.ID)
  • Applicant(ID,向外國KEY參考Offer.ID,...)

我知道我的代碼在表Offer錯誤,因爲一列不能引用多個表。我怎樣才能解決這個問題?

+0

哪種RDBMS適用於?請添加一個標籤來指定您是使用'mysql','postgresql','sql-server','oracle'還是'db2' - 或者其他的東西。 –

+0

對不起,我是SQL和stackoverflow的新手。下次我會關注。謝謝! –

+0

一列可以包含在幾個FK中。 – jarlh

回答

0

列可以是多個外鍵約束的一部分,但是當您指定源列兩次時,您的語法不正確。

相反無論是使用內聯這樣的約束:

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是否真的一樣?他們如何保持同步?這些表不應該是一個實體,如果它們共享主鍵(重構其他表的差異)?

+0

但是,當我將價值插入'提供'表中,它如何知道Condi或Uncondi表之間的選擇。例如'INSERT INTO OFFER(id,offer)VALUES(1,2)' –

+0

它不能。這是一個很好的跡象表明這種設計可能存在缺陷。如果您有一個與多個表具有外鍵關係的列,則您插入的值必須存在於所有引用的表中,並且您無法知道該提議是否真是ConditionalOffer或UnconditionalOffer。我的猜測是,你真正想要的是執行一條規則,聲明一個優惠必須是優惠類型之一,但不能同時進行。如果我是你,我會重新考慮數據庫模型。 – jpw