2013-04-02 31 views
-2

我在做一個SQL項目。當我宣佈外鍵時,我提出了一個問題。可以部分鍵(屬性是主鍵的一部分)是外鍵嗎?數據庫複合PK - 如何適當地製作FK?

編輯:感謝你們所有人的幫助。我想我只是解決了這個問題。但我有一個新問題。如果t1(a,b,c)和t1的主鍵是(a,b),那麼其他表的FK如何指向這個表?

+1

請重新填寫您的問題。 – rufo

回答

1

可能地,如果屬性是保證唯一地標識在主表中的記錄。但是,如果它符合該保證,那麼它爲什麼不被用作實際主鍵?

爲了避免許多煩惱,我建議你使用自動生成遞增的數字作爲主鍵數據類型,並聲明該密鑰作爲相關表的外鍵。大多數關係數據庫已經有一個符合這個描述的數字類型。

+0

謝謝你的建議。但在我的數據庫中的一個表中,所有的屬性組合在一起作爲主鍵。那我怎麼能把這個表引用到其他表中呢? –

+0

將屬性視爲組合鍵。但我的建議仍然存在。您應該爲主鍵使用「行序號」,而不是字段組合。 –

2

讓我們假設你的主鍵是由兩個字段(A,B)。 a或b可以是指向其他表的外鍵。但是如果另一個表有一個FK指向你的表,那麼你需要在另一個表中同時具有(a,b)的複合FK。

+0

太棒了!這就是我想知道的。非常感謝。 –

0

如果你正在談論的表的外鍵的右邊 - 是的。如果組合PK表是FK的左側 - 那麼另一個表必須與組合鍵匹配。

如果你有表tbl_1與PK(col1col2)和tbl_2col3列,你可以有FK從tbl_2.col3tbl_1.col2例如,(只要類型匹配和tbl_2.col3是唯一的),但不能從tbl_1.col2tbl_2.col3


編輯

如果這種情況是有一個表(tbl_1)與應該有一個外鍵,其他表複合PK,你要麼必須使另一個表包含所有列,因此它可以形成tbl_1的組合的PK,或更改tbl_1的PK。假設tbl_1.col1tbl_1.col2形成tbl_1的PK,您可以通過制定tbl_1.col1tbl_1.col2的唯一約束並添加您製作PK的單個列tbl_1.pk來更改它。

大多數ORM解決方案建議避免使用複合鍵 - 使它們唯一,而使用單個PK列 - 通常爲integerlong/bigint。因此,您可以更輕鬆地建立關係,並且單個數字列的PK性能會更好。

+0

謝謝你的回覆。我明白你的意思。但是如果情況是所有屬性組合在一起作爲表格中的主鍵,那麼我如何才能將此表引用到其他表中? –

+0

@帥帥,檢查我重新回答的答案 –