2011-04-07 97 views
2

我想知道在SQL Server中使用外鍵的原因,因爲我與同事之一進行了辯論。SQL Server中的外鍵

我有意見,當兩個表通過外鍵連接時,當記錄從父表中刪除,那麼從子表中刪除相同的引用記錄也應該刪除。

說例如我有兩個表,Table1和Table2。 Table1有一個id = 1的記錄,而Table2有兩個id = 1的記錄。表2是一個子表,通過一個外鍵與Table1連接。現在,當我嘗試從Table1中刪除id = 1記錄時,應該同時從Table2中刪除id = 1(2條記錄)。

他說這是錯誤的。如果是外鍵,我必須分別從兩個表中刪除記錄。

誰是正確的?

回答

3

這兩個答案都可以使用並且可以工作。

您的同事的版本會在您的應用程序(或您的DBA)上進行更多的責任刪除:應用程序(或DBA)必須首先檢查子行並刪除它們,然後刪除父行。這是有效的,並不會給你任何意想不到的驚喜。

如果你在你的外鍵約束(在幾乎任何嚴肅的關係數據庫系統中應該可能)上加上一個ON DELETE CASCADE選項,那麼行爲就是你描述它的方式 - 從商業角度來看這可能是有意義的(例如,刪除訂單中的所有訂單商品),但在其他情況下,它可能完全沒有任何意義(例如,如果您刪除了訂單編號1234,則通常不需要要刪除所有商品該訂單的訂單項目可能會參考)。

所以有兩種情況 - 在某些情況下都有意義,而在其他情況下則不那麼重要。這根本不是一個簡單的「或 - 或」/「正確與錯誤」的問題。

+0

好的答案,但並沒有完全回答OP關於'在SQL Server中使用外鍵'的第一個問題。但我認爲這會打擊範圍。 – 2011-04-07 18:38:31

+0

但是,如果我設置刪除和更新爲無操作的外鍵,當我嘗試從父表中刪除記錄,然後我得到錯誤的子表中的外鍵衝突。 – Abbas 2011-04-07 19:01:20

+0

@abbas:是的 - 如果你設置「無動作」,那麼它是**你的**首先刪除子行的責任。 – 2011-04-07 20:20:38

-2

我相信你的朋友是正確的 - 引用表不會自動刪除,因爲你刪除了一個有外鍵的表。但是,您可以設置觸發器來執行此操作。

外鍵主要用於指示數據模型中的關係 - 它們還可以通過添加額外的內容來增強表之間的數據完整性,以便在輸入數據時沒有參考表中存在的相應鍵值時拋出錯誤。

+1

讀到它,但他們可以,如果你有'上 – SQLMenace 2011-04-07 18:21:02

+0

這就是爲什麼我說,它不會自動做,但你可以添加觸發器做級聯delete' ... – roberttdev 2011-04-07 19:08:25

+0

你說觸發器,級聯刪除不是一個觸發器 – SQLMenace 2011-04-07 19:13:59

1

這取決於事物是如何定義的。你可以有一個cascading delete,或者讓它被封鎖(你必須首先刪除那個,然後另一個)

1

你是對的。

如果啓用級聯刪除,則在刪除主鍵行時,外鍵行也將被刪除。

1

您可以創建要在Cascade中刪除的表格。當您添加外鍵約束時,您需要指定衝突

CONSTRAINT fk1 
FOREIGN KEY(col) REFERENCES parent(col) ON DELETE CASCADE, 

否則,是的,您必須先刪除子項。