簡體   English   中英

SQL Server中的外鍵

[英]Foreign key in SQL Server

我想和一位同事辯論時,知道SQL Server中使用外鍵。

我認為,當通過外鍵連接兩個表時,從父表中刪除記錄時,子表中的相同參考記錄也應刪除。

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

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

誰是正確的?

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

同事的版本使您執行刪除的應用程序(或DBA)承擔更多責任:應用程序(或DBA)必須先檢查子行並刪除它們,然后再刪除父行。 這行得通,並且不會給您帶來任何意外的驚喜。

如果在外鍵約束上放置一個ON DELETE CASCADE選項(幾乎在任何嚴肅的關系數據庫系統中都應該是可能的),那么行為將是您描述它的方式-從業務角度來看這可能是有道理的(例如,刪除訂單的所有訂單商品),但在其他情況下,這可能根本沒有意義(例如,如果刪除編號為1234的訂單,則通常希望刪除訂單商品所針對的所有商品該命令可能會參考)。

因此,存在兩種情況-兩者在某些情況下有意義,而在其他情況下則沒有太大意義。 這根本不是一個簡單的“要么-要么” /“對與錯”問題。

這取決於事物的定義方式。 您可以級聯刪除 ,也可以阻止它(必須先刪除一個,然后刪除另一個)

你們都是對的。

如果啟用了級聯刪除,那么在刪除主鍵行時,外鍵行也將被刪除。

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

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

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

這取決於表1上是否有ON DELETE CASCADEON DELETE SET NULL 。如果您既沒有它又沒有被INITIALLY DEFERRED那么您將面臨INTEGRITY CONSTRAINT ,因為將有一個子記錄(在表2中)。 您可以在刪除/更新外鍵的情況下如何級聯工作中閱讀有關它的內容

我相信您的朋友是對的-引用的表不會僅因為您刪除具有外鍵的表而被自動刪除。 但是,您可以設置觸發器來執行此操作。

外鍵主要用於指示數據模型中的關系-外鍵還可以通過添加額外的內容來增強表之間的數據完整性,以便在沒有引用表中存在對應鍵值的情況下輸入數據時引發錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM