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