2012-12-21 168 views
1

在我們的數據庫系統中,我們有學生和人員領域。他們有PersonnelCardId和StudentCardId,我們把它們作爲主鍵。然後我們有一個支付cardID的支付設備,我們宣佈它是一個外鍵。我們不能在這種情況下插入一行,並且在研究之後,我們瞭解到我們不能將兩個主鍵引用到外鍵。那麼我們如何解決這種情況呢?謝謝。對外鍵的兩個主鍵引用

+3

任何作爲'子'的表(例如,有一個外鍵指向另一個'父'表)必須在父表中有一個匹配的記錄,然後才能插入到子中。例如創建您的人事和/或學生記錄之前,你沒有進入支付表。 –

+0

Okey,我們的問題是我們有兩個不同的Card ID,一個是studentCardId,另一個是名爲StudentsCardId的兩個不同的表名爲Students和Personnels,我們將它們聲明爲主鍵。所以根據你的定義,如果我們可以爲一個表添加一個匹配的記錄,它將失敗的另一個表。那麼我們該如何解決這個問題呢?我們應該改變什麼? –

回答

5

正如你所說的,一個外鍵不能同時引用兩個不同的表。根據您目前的架構中,cardID外鍵只能引用要麼PersonnelCardIdStudentCardId ...

如果我理解正確的話,你的架構看起來像:

PersonnelCard 
---------------- 
PersonnelCardID - PK 
PersonnelCardFields 


StudentCard 
---------------- 
StudentCardID - PK 
StudentCardFields 


PaymentDevice 
---------------- 
PaymentDeviceID - PK 
CardID - FK 

要解決這個問題,你必須找到一種方法,在PersonnelCardStudentCard表結合...

Card 
---------------- 
CardID - PK 
CardType - (Personnel or Student) 
CardFields 

的FK在PaymentDevice表,現在可以在新的引用PK表。

+0

實際上,我們不希望將人員和學生表結合在一起,但我們想出了另一個解決方案,即我們將studentCardId和personnelCardId作爲列放入PaymentDevice字段,並且想要像那樣約束它們,alter table PaymentDevice add constraint PaymentDevice_con檢查((StudentCardID = NOT NULL AND PersonnelCardId = NULL),反之亦然);然而,它似乎不工作,所以你怎麼看?這不合乎邏輯嗎? –

+1

@ user1463542與'NULL'比較時,您需要使用'IS'而不是'='...'(StudentCardID不爲NULL且PersonnelCardId爲NULL)' –

+2

@ user1463542而不是將'student'和'人員'表,你還可以創建一個新的'卡'表,並且'人員'和'學生'擁有他們自己的FK到這張卡表嗎? –