SQL Server 外鍵的更新的實際操作規(guī)則
此文主要向大家講述的是SQL Server 外鍵的更新(刪除)的實際操作規(guī)則,以前用數(shù)據(jù)庫德 時候一般都建表關(guān)系,但是把這些關(guān)系建好了之后往往都用不上,這次寫一個項目,涉及到多表的SQL Server 外鍵約束和級聯(lián)刪除的問題,才研究了一下.
用的vs2005里面自帶的SqlExpress,在VS里面作數(shù)據(jù)庫,感覺不是很方便(廢話,都方便了,那sqlserver2005 dev 賣給誰去!)
我建了表,然后建了關(guān)系,設(shè)定了外鍵約束.
然后就以為萬事大吉了,去寫代碼,畫界面去了.
把代碼和界面搞定后,一試驗刪除,刪除的級聯(lián)鏈中間的一個表的數(shù)據(jù),然后就報錯.
Title
DELETE 語句與 REFERENCE 約束"FK_課程擴展信息表_教師表"沖突。該沖突發(fā)生于數(shù)據(jù)庫"x:\xxx.MDF",表"dbo.課程擴展信息表", column '教師編號'。
語句已終止。
然后研究了下SQL Server 外鍵約束.到底是怎么回事.網(wǎng)上搜到一篇定義:
Title
FOREIGN KEY 約束
如果在 FOREIGN KEY 約束的列中輸入非 NULL 值,則此值必須在被引用的列中存在,否則將返回違反外鍵約束的錯誤信息。
FOREIGN KEY 約束應(yīng)用于前面所講的列,除非指定了源列。
FOREIGN KEY 約束僅能引用位于同一服務(wù)器上的同一數(shù)據(jù)庫中的表。數(shù)據(jù)庫間的引用完整性必須通過觸發(fā)器實現(xiàn)。有關(guān)更多信息,請參見 CREATE TRIGGER。
FOREIGN KEY 可以引用同一表中的其它列(自引用)。
列級 FOREIGN KEY 約束的 REFERENCES 子句僅能列出一個引用列,且該列必須與定義約束的列具有相同的數(shù)據(jù)類型。
表級 FOREIGN KEY 約束的 REFERENCES 子句中引用列的數(shù)目必須與約束列列表中的列數(shù)相同。每個引用列的數(shù)據(jù)類型也必須與列表中相應(yīng)列的數(shù)據(jù)類型相同。
如果 timestamp 類型的列是SQL Server 外鍵或被引用鍵的一部分,則不能指定 CASCADE。
可以在相互間具有引用關(guān)系的表上組合使用 CASCADE 和 NO ACTION。如果 SQL Server 遇到 NO ACTION,將終止執(zhí)行語句并回滾相關(guān)的 CASCADE 操作。當(dāng) DELETE 語句導(dǎo)致 CASCADE 和 NO ACTION 組合操作時,在 SQL Server 檢查 NO ACTION 操作之前將執(zhí)行所有 CASCADE 操作。
一個表最多可包含 253 個 FOREIGN KEY 約束。
對于臨時表不強制 FOREIGN KEY 約束。
每個表在其 FOREIGN KEY 約束中最多可以引用 253 個不同的表。
FOREIGN KEY 約束只能引用被引用表的 PRIMARY KEY 或 UNIQUE 約束中的列或被引用表上 UNIQUE INDEX 中的列。
仍然不解其意.
然后在關(guān)系圖中的關(guān)系上點擊右鍵,查看屬性,發(fā)現(xiàn)其"INSERT 和 UPDATE 規(guī)范類別 "內(nèi)都是"無操作",感覺應(yīng)該是這里的問題.
上msdn上搜索了一下,發(fā)現(xiàn)了這篇文章: 可視化數(shù)據(jù)庫工具-外鍵列屬性
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vdt01/html/2cb23e81-6342-4390-9d0e-b7a4805eca0f.htm
關(guān)鍵的幾句在這里:
Title
INSERT 和 UPDATE 規(guī)范類別
展開以顯示有關(guān)該關(guān)系的“刪除規(guī)則”和“更新規(guī)則”的信息。
刪除規(guī)則
指定當(dāng)數(shù)據(jù)庫的最終用戶嘗試刪除某一行,而該行包含外鍵關(guān)系所涉及的數(shù)據(jù)時所發(fā)生的情況。如果設(shè)置為:
無操作 顯示一條錯誤信息,告知用戶不允許執(zhí)行該刪除操作,DELETE 將被回滾。
級聯(lián) 刪除包含外鍵關(guān)系中所涉及的數(shù)據(jù)的所有行。
設(shè)置空 如果表的所有外鍵列都可接受空值,則將該值設(shè)置為空。僅適用于 SQL Server 2005。
設(shè)置默認值 如果表的所有外鍵列均已定義默認值,則將該值設(shè)置為列定義的默認值。僅適用于 SQL Server 2005。
更新規(guī)則
指定當(dāng)數(shù)據(jù)庫的用戶嘗試更新某一行,而該行包含SQL Server 外鍵關(guān)系所涉及的數(shù)據(jù)時所發(fā)生的情況。如果設(shè)置為:
無操作 顯示一條錯誤信息,告知用戶不允許執(zhí)行該刪除操作,DELETE 將被回滾。
級聯(lián) 刪除包含外鍵關(guān)系中所涉及的數(shù)據(jù)的所有行。
設(shè)置空 如果表的所有外鍵列都可接受空值,則將該值設(shè)置為空。僅適用于 SQL Server 2005。
設(shè)置默認值 如果表的所有外鍵列均已定義默認值,則將該值設(shè)置為列定義的默認值。僅適用于 SQL Server 2005。
總算是明白了:
1.在vs2005中,外鍵約束的屬性窗口中它不叫"級聯(lián)",叫"層疊",估計是翻譯錯誤.
2.vs2005中,在關(guān)系圖中建立外鍵約束,它"默認的INSERT 和 UPDATE 規(guī)范"都是"無操作".
也就是說,你只要更新或刪除,它都會報錯.
3.解決的方法:
a.刪除的時候好辦,級聯(lián)刪除就可以了.但更新的時候還得好好考慮.
b.或者干脆去掉外鍵約束,自己考慮,然后寫transcation sql.
原文標題:SQL Server 外鍵 更新(刪除)規(guī)則
連接:http://www.cnblogs.com/yelaiju/archive/2010/05/31/1748380.html
【編輯推薦】