萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> sql server教程 >> 淺談SQL SERVER 2005 之引用完整性

淺談SQL SERVER 2005 之引用完整性

  為什麼想介紹sql server 2005 的引用完整性:

  一是因為在SQL server 2005中,添加了SQL server 2000中沒有的一些新功能,而這又很少被人們注意到;

  二是對於SQL SERVER數據庫的初學者來說,引用完整性往往是他們難以理解和掌握的。

  在SQL Server聯機叢書中,將數據完整性解釋如下:“存儲在數據庫中的所有數據值均正確的狀態。如果數據庫中存儲有不正確的數據值,則該數據庫稱為已喪失數據完整性。”強制數據完整性可確保數據庫中的數據質量。

  數據完整性分類

  在SQL Server中,根據數據完整新措施所作用的數據庫對象和范圍不同,可以將數據完整性分為以下幾種:

  實體完整性

  域完整性

  引用完整性

  用戶定義完整性

  引用完整性

  引用完整性又稱參照完整性。引用完整性用來保證主表和從表之間的數據一致性,它通過主鍵(PRIMARY KEY)約束和外鍵(FOREIGN KEY)約束來實現。

  強制引用完整性時,SQL server 將防止用戶執行下列操作:

  在主表中沒有關聯的記錄時,將記錄添加或更改到相關表中。

  更改主表中的值,這會導致相關表中生成孤立記錄。

  從主表中刪除記錄,但仍存在與該記錄匹配的相關記錄。

  也就是說,如果數據庫的表之間為了確保數據的一致性,建立了引用完整性之後,則要求:

  1、 在主表中,當其主鍵值被其從表所參照時,該行不能被刪除也不允許改變;

  2、 在從表中,不允許參照主表中不存在的主鍵值。

  3、 如果主表的鍵值更改了,那麼在整個數據庫中,對該鍵值的所有引用的從表要進行一致的更改;

  簡單的示例:

  建立一個student數據庫,建立了學生表(Students)和成績表(Score),Students表的學號字段SCode與Score表的StudentID字段建立了引用完整性約束(主外鍵關系):

淺談SQL SERVER 2005 之引用完整性

  注意:在SQL server 2005中,建立主外鍵關系應該在從表中建立。為什麼?因為在選擇從表時,在SQL server 2005默認會選擇你所在的表,並且不能更改。(不包含在“數據庫關系圖”中建立)

  如果在學生表(Students)中的某個學生,在成績表(Score)中有相關的考試成績,那麼在學生表(Students)中刪除該學生,將會報錯:

淺談SQL SERVER 2005 之引用完整性

  消息 547,級別 16,狀態 0,第 1 行

  DELETE 語句與 REFERENCE 約束"FK_Score_Score"沖突。該沖突發生於數據庫"student",表"dbo.Score", column 'StudentID'。

  語句已終止。

  是不是說我們在刪除或者更改主表中的某條記錄的時候,就一定要在整個數據庫中,對該鍵值的所有引用的從表的記錄進行相應一致的刪除或更改呢?

  是的!但我們可以讓數據庫幫我們代勞。

  sql server 2005之引用完整性的新特性登場:

  選擇從表――> 右鍵“修改”――>右鍵“關系”――>選擇一個關系名就可以看到如下圖所示:

淺談SQL SERVER 2005 之引用完整性

  INSERT 和 UPDATE 規范

淺談SQL SERVER 2005 之引用完整性

  刪除規則和更新規則:

  指定當數據庫的最終用戶嘗試刪除或更新某一行,而該行包含外鍵關系所涉及的數據時所發生的情況。

  如果設置為:

  無操作:當在刪除或更新主鍵表的數據時,將顯示一條錯誤信息,告知用戶不允許執行該刪除或更新操作,刪除或更新操作將會被回滾。

  層疊:刪除或更新包含外鍵關系中所涉及的數據的所有行。

  說明:“層疊”在SQL server 2000中又叫“級聯”。

  設置空:這是SQL server 2005新增的功能。如果表的所有外鍵列都可以接受空值,則將該值設置為空。

  說明:要將外鍵的刪除規則和更新規則設為“設置空”,則該外鍵必須是可以為空的字段。

  設置默認值:這是SQL server 2005新增的功能。如果表的所有外鍵列都已定義了默認值,則將該值設置為該列定義的默認值。

  說明:要將外鍵的刪除規則和更新規則設置為“設置默認值”,該外鍵必須是有默認值的字段。

  附加:

  特地查看了一下SQL server 2000,在它的“關系”中也包括了如下功能:

淺談SQL SERVER 2005 之引用完整性

  至於SQL server 2005新增的功能,估計用觸發器應該可以實現吧,沒有研究就不多言了。

  相關引用:

  級聯運行(Cascaded operation)

  觸發器是自動的:它們在對表的數據作了任何修改(比如手工輸入或者應用程序采取的操作)之後立即被激活。

  觸發器可以偵測數據庫內的操作,並自動地級聯影響整個數據庫的各項內容。例如,某個表上的觸發器中包含有對另外一個表的數據操作(如刪除,更新,插入)而該操作又導致該表上觸發器被觸發。

  例如,通過觸發器對數據庫中的相關表進行層疊更改:

  在 titles 表的 title_id 列上寫入一個刪除觸發器,以使其它表中的各匹配行采取刪除操作。該觸發器用 title_id 列作為唯一鍵,在 titleauthor、sales 及 roysched 表中對各匹配行進行定位。

關鍵詞:

copyright © 萬盛學電腦網 all rights reserved