參照完整性

參照完整性

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

概念介紹


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

引用關係


同一關係

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

兩個關係

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

多個關係

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

表間規則


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

實踐應用


例如,如果在學生表和選修課之間用學號建立關聯,學生表是主表,選修課是從表,那麼,在向從表中輸入一條新記錄時,系統要檢查新記錄的學號是否在主表中已存在,如果存在,則允許執行輸入操作,否則拒絕輸入,這就是參照完整性。
參照完整性還體現在對主表中的刪除和更新操作,例如,如果刪除主表中的一條記錄,則從表中凡是外鍵的值與主表的主鍵值相同的記錄也會被同時刪除,將此稱為級聯刪除;如果修改主表中主關鍵字的值,則從表中相應記錄的外鍵值也隨之被修改,將此稱為級聯更新。
學生表(主表)
學號(主碼)姓名性別課程代碼成績
200101王小二SQL10166
200102陳小春C++10279
選修課表(從表)
課程代碼(主碼)課程名稱任課老師上課地點選課學生學號(外碼)
SQL101資料庫速成劉小春實驗室222200101
C++102C++面向對象黃弘實驗室333200102
參照完整性的體現:不可以在表二中插入“200103”數據,因為值“200103”在主表中不存在加入“200103”數據破壞了完整性的原則,也就是破壞了多表間(A表主碼=B表外碼)的一致性。不同的表相同的列名的數據保持不變,不能單獨增加,就算要增加(或刪除)也要同時增加(或刪除)。