[英]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 CASCADE
或ON DELETE SET NULL
。如果您既沒有它又沒有被INITIALLY DEFERRED
那么您將面臨INTEGRITY CONSTRAINT
,因為將有一個子記錄(在表2中)。 您可以在刪除/更新外鍵的情況下如何級聯工作中閱讀有關它的內容?
我相信您的朋友是對的-引用的表不會僅因為您刪除具有外鍵的表而被自動刪除。 但是,您可以設置觸發器來執行此操作。
外鍵主要用於指示數據模型中的關系-外鍵還可以通過添加額外的內容來增強表之間的數據完整性,以便在沒有引用表中存在對應鍵值的情況下輸入數據時引發錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.