複製鏈接
請複製以下鏈接發送給好友

參照完整性

鎖定
參照的完整性要求關係中不允許引用不存在的實體。與實體完整性關係模型必須滿足的完整性約束條件,目的是保證數據的一致性。參照完整性又稱引用完整性
中文名
參照完整性
外文名
Referential Integrity
應    用
數據庫

參照完整性定義

參照完整性是關係模型的完整約束之一,屬於數據完整性的一種,其餘還有:實體完整性、用户自定義完整性
參照完整性規則:若屬性或屬性組F是基本關係R的外鍵,它與基本關係S的主鍵Ks相對應(基本關係R和S不一定是不同的關係),則對於R中的每個元組在F上的值必須為: [1] 
(1)空值,F的每個屬性值均為空值。
(2)S中某個元組中的主鍵值(主碼值)。
即參照的關係中的屬性值必須能夠在被參照關係找到或者取空值,否則不符合數據庫的語義。在實際操作時如更新、刪除、插入一個表中的數據,通過參照引用相互關聯的另一個表中的數據,來檢查對錶數據操作是否正確,不正確則拒絕操作。

參照完整性引用關係

參照完整性同一關係

參照完整性 參照完整性
在參照完整性規則中,R和S可以是同一個關係。
在學生(學號,姓名,性別,年齡,專業號,班長)關係中,“學號”屬性是主鍵,“班長”屬性表示該學生所在班級的班長的學號,因此它應用的本關係“學號”屬性。按照參照完整性規則,“班長”屬性可以取以下兩類值:
(1)空值,表示該學生所在班級尚未選出班長。
(2)非空值,該值必須是本關係中某個元組的學號值,即某個當選班長的學生的學號值。 [2] 

參照完整性兩個關係間

如學生實體和專業實體可以用下列關係模式來表示,其中學號是學生的主鍵,專業號是專業的主鍵:
學生(學號,姓名,性別,專業號,年齡)
專業(專業號,專業名)
這兩個關係之間存在着屬性的引用(含有相同的屬性“專業號”),學生關係引用了專業關係的主鍵“專業號”,專業號則是學生關係的外鍵。而且按照參照完整性規則,學生關係(並非專業關係)中的每個元組的“專業號”屬性只能取兩種值:
(1)空值,表示尚未給學生分配專業。
(2)非空值,這時該值必須是專業關係中某個元組的“專業號”值,表示該學生不可能分配到一個不存在的專業中去。就是説學生關係中的某個屬性的取值需要參照專業關係的屬性取值。

參照完整性兩個以上的關係

兩個以上的關係也可以存在引用關係,學生、課程、選課(學生與課程)之間的聯繫可以用下列三個關係來表示:
學生(學號,姓名,性別,專業號,年齡)
專業(專業號,專業名)
選課(學號,課程號,成績)
這裏的“學號”和“課程號”屬性都是選課關係的外鍵,但只有“學號”和“課程號”聯合起來才能確定選課的關係,所以這裏存在一個複合主鍵關係,(學號,課程號)是選課關係的主鍵。雖然按照參照完整性可以取兩類值,但是由於實體完整性,複合主鍵中的每個屬性均不能取空值。所以選課關係中的”學號“和”課程號”屬性實際上只能取被參照關係(學生關係和專業關係)中已經存在的主鍵值。即選課關係中的“學號”值必須是確實存在的學生的學號,學生關係中有該學生的記錄;選課關係中的“課程號”值也必須是確定存在的課程的課程號,即課程關係中有該課程的記錄。 [3] 

參照完整性性質

參照完整性屬於表間規則。對於永久關係的相關表,在更新、插入或刪除記錄時,如果只改其一不改其二,就會影響數據的完整性:例如修改父表中關鍵字值後,子表關鍵字值未做相應改變;刪除父表的某記錄後,子表的相應記錄未刪除,致使這些記錄成為孤立記錄;對於子表插入的記錄,父表中沒有相應關鍵字值的記錄;等等。對於這些涉及表間數據的完整性,統稱為參照完整性。
參照完整性則是相關聯的兩個表之間的約束,具體的説,就是從表中每條記錄外鍵的值必須是主表中存在的,因此,如果在兩個表之間建立了關聯關係,則對一個關係進行的操作要影響到另一個表中的記錄。
如果實施了參照完整性,那麼當主表中沒有相關記錄時,就不能將記錄添加到相關表中。也不能在相關表中存在匹配的記錄時刪除主表中的記錄,更不能在相關表中有相關記錄時,更改主表中的主鍵值。也就是説,實施了參照完整性後,對錶中主鍵字段進行操作時系統會自動地檢查主鍵字段,看看該字段是否被添加、修改、刪除了。如果對主鍵的修改違背了參照完整性的要求,那麼系統就會自動強制執行參照完整性。

參照完整性應用

例如,如果在學生表和選修課之間用學號建立關聯,學生表是主表,選修課是從表,那麼,在向從表中輸入一條新記錄時,系統要檢查新記錄的學號是否在主表中已存在,如果存在,則允許執行輸入操作,否則拒絕輸入,這就是參照完整性。
參照完整性還體現在對主表中的刪除和更新操作,例如,如果刪除主表中的一條記錄,則從表中凡是外鍵的值與主表的主鍵值相同的記錄也會被同時刪除,將此稱為級聯刪除;如果修改主表中主關鍵字的值,則從表中相應記錄的外鍵值也隨之被修改,將此稱為級聯更新
學生表(主表)
學號(主碼)
姓名
性別
課程代碼
成績
200101
王小二
SQL101
66
200102
陳小春
C++102
79
選修課表(從表)
課程代碼(主碼)
課程名稱
任課老師
上課地點
選課學生學號(外碼)
SQL101
數據庫速成
劉小春
實驗室222
200101
C++102
C++面向對象
黃弘
實驗室333
200102
參照完整性的體現:不可以在表二中插入“200103”數據,因為值“200103”在主表中不存在加入“200103”數據破壞了完整性的原則,也就是破壞了多表間(A表主碼=B表外碼)的一致性。不同的表相同的列名的數據保持不變,不能單獨增加,就算要增加(或刪除)也要同時增加(或刪除)。
參考資料
  • 1.    周屹 李豔娟.數據庫原理及開發應用(第二版):清華大學出版社,2013:50
  • 2.    3.2 關係的完整性  .讀書頻道[引用日期2016-10-03]
  • 3.    王珊 薩師煊.數據庫系統概論(第5版):高等教育出版社,2014:47-48