為什麼想介紹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默認會選擇你所在的表,並且不能更改。(不包含在“數據庫關系圖”中建立)
如果在學生表(Students)中的某個學生,在成績表(Score)中有相關的考試成績,那麼在學生表(Students)中刪除該學生,將會報錯:
消息 547,級別 16,狀態 0,第 1 行
DELETE 語句與 REFERENCE 約束"FK_Score_Score"沖突。該沖突發生於數據庫"student",表"dbo.Score", column 'StudentID'。
語句已終止。
是不是說我們在刪除或者更改主表中的某條記錄的時候,就一定要在整個數據庫中,對該鍵值的所有引用的從表的記錄進行相應一致的刪除或更改呢?
是的!但我們可以讓數據庫幫我們代勞。
sql server 2005之引用完整性的新特性登場:
選擇從表――> 右鍵“修改”――>右鍵“關系”――>選擇一個關系名就可以看到如下圖所示:
INSERT 和 UPDATE 規范
刪除規則和更新規則:
指定當數據庫的最終用戶嘗試刪除或更新某一行,而該行包含外鍵關系所涉及的數據時所發生的情況。
如果設置為:
無操作:當在刪除或更新主鍵表的數據時,將顯示一條錯誤信息,告知用戶不允許執行該刪除或更新操作,刪除或更新操作將會被回滾。
層疊:刪除或更新包含外鍵關系中所涉及的數據的所有行。
說明:“層疊”在SQL server 2000中又叫“級聯”。
設置空:這是SQL server 2005新增的功能。如果表的所有外鍵列都可以接受空值,則將該值設置為空。
說明:要將外鍵的刪除規則和更新規則設為“設置空”,則該外鍵必須是可以為空的字段。
設置默認值:這是SQL server 2005新增的功能。如果表的所有外鍵列都已定義了默認值,則將該值設置為該列定義的默認值。
說明:要將外鍵的刪除規則和更新規則設置為“設置默認值”,該外鍵必須是有默認值的字段。
附加:
特地查看了一下SQL server 2000,在它的“關系”中也包括了如下功能:
至於SQL server 2005新增的功能,估計用觸發器應該可以實現吧,沒有研究就不多言了。
相關引用:
級聯運行(Cascaded operation)
觸發器是自動的:它們在對表的數據作了任何修改(比如手工輸入或者應用程序采取的操作)之後立即被激活。
觸發器可以偵測數據庫內的操作,並自動地級聯影響整個數據庫的各項內容。例如,某個表上的觸發器中包含有對另外一個表的數據操作(如刪除,更新,插入)而該操作又導致該表上觸發器被觸發。
例如,通過觸發器對數據庫中的相關表進行層疊更改:
在 titles 表的 title_id 列上寫入一個刪除觸發器,以使其它表中的各匹配行采取刪除操作。該觸發器用 title_id 列作為唯一鍵,在 titleauthor、sales 及 roysched 表中對各匹配行進行定位。
關鍵詞: