2010-08-25 53 views
0

如果我使用自然連接比使用主鍵和外鍵什麼的?我可以使用自然連接代替主鍵和外鍵嗎?

+1

我之前並不知道這個「自然連接」,但在編寫查詢時,似乎並不是一個好主意,除非(或者,即使?)有強大的命名約定以避免列名衝突。 'employee(ID,name,dept_id)'和'department(ID,name,manager_id)'之間的連接根本無法正常工作...... – pascal 2010-08-25 10:54:50

回答

3

主鍵和外鍵是數據庫的類型約束:它們的目的是確保數據的完整性,而不是方便連接。

主鍵:對於主鍵列,一定不能有多於一行的值相同。

外鍵:每行的外鍵列中的每個值都必須與引用/父表中的行的主鍵(或唯一鍵)相對應。

1

不太確定你在問什麼。加入和PK/FK有所不同 - 而且它們顯然不能替代對方。 PK和FK實施約束以確保數據的正確性。連接是一種查詢操作。

1

自然連接通常是一個壞主意。您可能無意中加入了錯誤的領域,然後您的結果都是錯誤的,但看起來是正確的。即使他們起初工作,稍後對數據庫的更改可能會徹底改變您的查詢結果,並且很難弄清楚。我絕不會使用自然連接。

PK和FKS在那裏強制執行數據完整性,無論您是否使用自然連接,刪除它們都是一個非常糟糕的主意。沒有合適的PKS和FK的數據庫幾乎總是最終包含錯誤的數據。

+0

只要指定了哪些列,自然連接就是一個好主意將被加入表中。如果你這樣做,那麼自然連接的行爲是完全可以預測和「安全」的。不幸的是,在進行連接之前選擇列*的SQL語法有點冗長(需要派生表子查詢)。所以這就是爲什麼大多數人傾向於避免自然連接的真正原因,即使SQL支持它們也是如此 - 因爲它需要更多的代碼。 – sqlvogel 2010-08-26 09:21:51

+0

一般來說,這並不安全!只需添加一列,並且可以爲連接挑選它,因爲它的名稱與另一個表中的列匹配,因此連接現在是「錯誤的」。調用它是安全的或多或少像說「SELECT * FROM mytable」是安全的...是的,只要沒有人添加列,並更改列順序... – pascal 2010-08-27 10:59:43