轉載:http://database.51cto.com/art/201006/206351.htm
此文主要向大家講述的是SQL Server 外鍵的更新(刪除)的實際操作規則,以前用資料庫德 時候一般都建表關係,但是把這些關係建好了之後往往都用不上,這次寫一個項目,涉及到多表的SQL Server 外鍵約束和串聯刪除的問題,才研究了一下.
用的vs2005裡面內建的SqlExpress,在VS裡面作資料庫,感覺不是很方便(廢話,都方便了,那sqlserver2005 dev 賣給誰去!)
我建了表,然後建了關係,設定了外鍵約束.
然後就以為萬事大吉了,去寫代碼,畫介面去了.
把代碼和介面搞定後,一實驗刪除,刪除的級聯鏈中間的一個表的資料,然後就報錯.
Title
DELETE 語句與 REFERENCE 約束"FK_課程擴充資訊表_教師表"衝突。該衝突發生於資料庫"x:\xxx.MDF",表"dbo.課程擴充資訊表", column '教師編號'。
語句已終止。
然後研究了下SQL Server 外鍵約束.到底是怎麼回事.網上搜到一篇定義:
Title
FOREIGN KEY 約束
如果在 FOREIGN KEY 約束的列中輸入非 NULL 值,則此值必須在被引用的列中存在,否則將返回違反外鍵約束的錯誤資訊。
FOREIGN KEY 約束應用於前面所講的列,除非指定了源列。
FOREIGN KEY 約束僅能引用位於同一伺服器上的同一資料庫中的表。資料庫間的參考完整性必須通過觸發器實現。有關更多資訊,請參見 CREATE TRIGGER。
FOREIGN KEY 可以引用同一表中的其它列(自引用)。
列級 FOREIGN KEY 約束的 REFERENCES 子句僅能列出一個引用列,且該列必須與定義約束的列具有相同的資料類型。
表級 FOREIGN KEY 約束的 REFERENCES 子句中引用列的數目必須與約束列列表中的列數相同。每個引用列的資料類型也必須與列表中相應列的資料類型相同。
如果 timestamp 類型的列是SQL Server 外鍵或參考索引鍵的一部分,則不能指定 CASCADE。
可以在相互間具有參考關聯性的表上組合使用 CASCADE 和 NO ACTION。如果 SQL Server 遇到 NO ACTION,將終止執行語句並復原相關的 CASCADE 操作。當 DELETE 語句導致 CASCADE 和 NO ACTION 組合操作時,在 SQL Server 檢查 NO ACTION 操作之前將執行所有 CASCADE 操作。
一個表最多可包含 253 個 FOREIGN KEY 約束。
對於暫存資料表不強制 FOREIGN KEY 約束。
每個表在其 FOREIGN KEY 約束中最多可以引用 253 個不同的表。
FOREIGN KEY 約束只能引用被參考資料表的 PRIMARY KEY 或 UNIQUE 約束中的列或被參考資料表上 UNIQUE INDEX 中的列。
仍然不解其意.
然後在關係圖中的關係上點擊右鍵,查看屬性,發現其"INSERT 和 UPDATE 規範類別 "內都是"無操作",感覺應該是這裡的問題.
上msdn上搜尋了一下,發現了這篇文章: 可視化資料庫工具-外鍵列屬性
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vdt01/html/2cb23e81-6342-4390-9d0e-b7a4805eca0f.htm
關鍵的幾句在這裡:
Title
INSERT 和 UPDATE 規範類別
展開以顯示有關該關係的“刪除規則”和“更新規則”的資訊。
刪除規則
指定當資料庫的終端使用者嘗試刪除某一行,而該行包含外鍵關係所涉及的資料時所發生的情況。如果設定為:
無操作 顯示一條錯誤資訊,告知使用者不允許執行該刪除操作,DELETE 將被復原。
級聯 刪除包含外鍵關係中所涉及的資料的所有行。
設定空 如果表的所有外鍵列都可接受空值,則將該值設定為空白。僅適用於 SQL Server 2005。
設定預設值 如果表的所有外鍵列均已定義預設值,則將該值設定為列定義的預設值。僅適用於 SQL Server 2005。
更新規則
指定當資料庫的使用者嘗試更新某一行,而該行包含SQL Server 外鍵關係所涉及的資料時所發生的情況。如果設定為:
無操作 顯示一條錯誤資訊,告知使用者不允許執行該刪除操作,DELETE 將被復原。
級聯 刪除包含外鍵關係中所涉及的資料的所有行。
設定空 如果表的所有外鍵列都可接受空值,則將該值設定為空白。僅適用於 SQL Server 2005。
設定預設值 如果表的所有外鍵列均已定義預設值,則將該值設定為列定義的預設值。僅適用於 SQL Server 2005。
總算是明白了:
1.在vs2005中,外鍵約束的屬性視窗中它不叫"級聯",叫"層疊",估計是翻譯錯誤.
2.vs2005中,在關係圖中建立外鍵約束,它"預設的INSERT 和 UPDATE 規範"都是"無操作".
也就是說,你只要更新或刪除,它都會報錯.
3.解決的方法:
a.刪除的時候好辦,串聯刪除就可以了.但更新的時候還得好好考慮.
b.或者乾脆去掉外鍵約束,自己考慮,然後寫transcation sql.
原文標題:SQL Server 外鍵 更新(刪除)規則
串連:http://www.cnblogs.com/yelaiju/archive/2010/05/31/1748380.html
——————————————————————————————————————————————————————
sql server 2008也一樣,還沒搞清楚更新規則選“級聯”會怎麼樣,把資料都刪除了,還怎麼更新呢?