1. 程式人生 > >SQLSERVER外來鍵約束NO ACTION,CASCADE,SET NULL,SET DEFAULT

SQLSERVER外來鍵約束NO ACTION,CASCADE,SET NULL,SET DEFAULT

大部分的資料是類似下面這樣寫的:

NO ACTION
指定如果試圖刪除/修改某一行,而該行的鍵被其他表的現有行中的外來鍵所引用,則產生錯誤並回滾 DELETE/UPDATE語句。
CASCADE、SET NULL 和 SET DEFAULT
允許通過刪除或更新鍵值來影響指定具有外來鍵關係的表,這些外來鍵關係可追溯到在其中進行修改的表。如果為目標表也定義了級聯引用操作,那麼指定的級聯操作也將應用於刪除或更新的那些行。不能為具有 timestamp 列的外來鍵或主鍵指定 CASCADE。
ON DELETE CASCADE
指定如果試圖刪除某一行,而該行的鍵被其他表的現有行中的外來鍵所引用,則也將刪除所有包含那些外來鍵的行。
ON UPDATE CASCADE
指定如果試圖更新某一行中的鍵值

,而該行的鍵值被其他表的現有行中的外來鍵所引用,則組成外來鍵的所有值也將更新到為該鍵指定的新值。 (如果 timestamp 列是外來鍵或被引用鍵的一部分,則不能指定 CASCADE。 )
ON DELETE SET NULL
指定如果試圖刪除某一行,而該行的鍵被其他表的現有行中的外來鍵所引用,則組成被引用行中的外來鍵的所有值將被設定為 NULL。目標表的所有外來鍵列必須可為空值,此約束才可執行。
ON UPDATE SET NULL
指定如果試圖更新某一行 ,而該行的鍵被其他表的現有行中的外來鍵所引用,則組成被引用行中的外來鍵的所有值將被設定為 NULL。目標表的所有外來鍵列必須可為空值,此約束才可執行。
ON DELETE SET DEFAULT
指定如果試圖刪除某一行
,而該行的鍵被其他表的現有行中的外來鍵所引用,則組成被引用行中的外來鍵的所有值將被設定為它們的預設值。目標表的所有外來鍵列必須具 有預設值定義,此約束才可執行。如果某個列可為空值,並且未設定顯式的預設值,則會使用 NULL 作為該列的隱式預設值。因 ON DELETE SET DEFAULT 而設定的任何非空值在主表中必須有對應的值,才能維護外來鍵約束的有效性。
ON UPDATE SET DEFAULT
指定如果試圖更新某一行 ,而該行的鍵被其他表的現有行中的外來鍵所引用,則組成被引用行中的外來鍵的所有值將被設定為它們的預設值。目標表的所有外來鍵列必須具 有預設值定義,此約束才可執行。如果某個列可為空值,並且未設定顯式的預設值,則會使用 NULL 作為該列的隱式預設值。因 ON UPDATE SET DEFAULT 而設定的任何非空值在主表中必須有對應的值,才能維護外來鍵約束的有效性。

看到以上顏色特殊的文字了嗎?按文字的含義是不是ON UPDATE SET NULL、DEFAULT可以在不更改主表鍵值的情況下(即只要更改非主鍵的任何一列),子表中相應的外來鍵值就改成null或default了呢?

答案是否定的,必須更改鍵值才會生效。

於是建議那些原創的、轉載的,認真讀讀字眼,仔細寫上文字。雖然實踐試試便知,但是作為資料而言,務必追求正確嚴謹。MSDN乾脆就不寫鍵值,全部只寫:“如果更新了父表中的相應行”,這樣雖然無可厚非,但是卻沒有道明白:“必須更新鍵值”。而那些部分寫部分不寫的資料更讓人迷惑。

另外,SQLSERVER 2000只支援 NO ACTION | CASCADE,2005版本以後才支援 SET NULL | SET DEFAULT。