2011-06-26 50 views
1

我正在開發一個類似於服務檯的系統,我想使用外鍵來確保數據庫結構體面,但我不知道是否應該在所有,以及如何正確使用它們。如何正確使用外鍵

有沒有關於如何(以及何時)使用外鍵的很好的教程?

編輯在那裏我最困惑的部分,在是ON DELETE .. ON UPDATE ..一部分,讓我們說,我有以下表

table 'users' 
id int PK auto_increment 
department_id int FK (departments.department_id) NULL 
name varchar 

table 'departments' 
id int PK auto_increment 
name 

users.department_id是一個外鍵從departments.department_id,當我想要刪除部門或用戶時,ON UPDATE和ON DELETE函數如何工作?

+0

你可能會比在這個網站上閱讀無數[關於外鍵的問題](http://stackoverflow.com/search?q=foreign+keys)更糟糕。 – Orbling

回答

2

如果您將數據庫拆分爲表並且您正在使用DBMS(例如MySQL,Oracle和其他),則需要外鍵。我從你的標籤中假設你正在使用MySQL。

如果您不使用外鍵,您的數據庫將變得難以管理和維護。規範化過程確保數據一致性,使用外鍵。

here for foreign keys.在這裏看到why foreign keys are important in a relational database here.

雖然當效率是設計的主要因素非規範化經常被使用。如果是這種情況,你可能想要離開我所告訴你的事情。

希望這會有所幫助。

+0

+1雖然我不同意你只需要外鍵,因爲你有表格,但它們在大多數情況下肯定有幫助。 –

+0

到目前爲止,這很清楚,ON DELETE .. ON UPDATE ..部分怎麼樣? (編輯問題) – Sander

+0

打算髮布,但注意到我不能說下面比Kerrek好得多。 – adamjmarkham

4

ON DELETEON UPDATE指您在密鑰表中所做的更改傳播到相關表。 UPDATE意味着關鍵值在依賴表中被修改以維護關係,DELETE意味着從屬記錄被刪除以保持完整性。

示例:假設您有

Users: Name = Bob, Department = 1 
Users: Name = Jim, Department = 1 
Users: Name = Roy, Department = 2 

Departments: id = 1, Name = Sales 
Departments: id = 2, Name = Bales 

現在,如果你改變了部門工作人員修改表中的第一個記錄讀取id = 5, Name = Sales,然後用「UPDATE」,你也將改變前兩個記錄要讀取Department = 5 - 如果沒有「更新」,則不允許進行更改!

同樣,如果你刪除了Department 2,那麼用「DELETE」你也會刪除Roy的記錄!沒有「刪除」,如果不先刪除Roy,就不允許刪除該部門。