SQL Server 外鍵 更新(刪除)規則

來源:互聯網
上載者:User

轉載: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也一樣,還沒搞清楚更新規則選“級聯”會怎麼樣,把資料都刪除了,還怎麼更新呢?

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.