徹底聊聊關(guān)系數(shù)據(jù)庫(kù)中的完整性約束:實(shí)體完整性、參照完整性和用戶定義的完整性
結(jié)論描述
先用最簡(jiǎn)單的話總結(jié)一下,實(shí)體、參照和用戶定義的完整性,避免理論性的論述性的內(nèi)容過(guò)長(zhǎng)過(guò)繁。
實(shí)體完整性:是用來(lái)唯一標(biāo)識(shí)實(shí)體的要求(即現(xiàn)實(shí)世界中唯一存在的一個(gè)事物、人或個(gè)體)。不能為空,需要唯一確認(rèn),表示的是這一條記錄的實(shí)體的完整唯一,通常用主鍵描述,不能為空且不重復(fù)。
參照完整性:它表示的是兩個(gè)關(guān)系之間的聯(lián)系,是表與表之間的引用。對(duì)應(yīng)的就是外鍵,外鍵約束實(shí)現(xiàn)參照完整性。
外碼(外鍵)要么取空值,要么取引用的表的主碼(主鍵)值,或碼的值。
用戶定義的完整性:這是針對(duì)某個(gè)具體的業(yè)務(wù)、特定的實(shí)際需求而定義的,關(guān)系中的屬性需要滿足的條件或取值范圍等。即數(shù)據(jù)庫(kù)管理系統(tǒng)提供并實(shí)現(xiàn)由用戶自己定義的某個(gè)完整性。
完整性介紹
數(shù)據(jù)完整性約束指的是為了防止不符合規(guī)范的數(shù)據(jù)進(jìn)入數(shù)據(jù)庫(kù),在用戶對(duì)數(shù)據(jù)進(jìn)行插入、修改、刪除等操作時(shí),DBMS自動(dòng)按照一定的約束條件對(duì)數(shù)據(jù)進(jìn)行監(jiān)測(cè),使不符合規(guī)范的數(shù)據(jù)不能進(jìn)入數(shù)據(jù)庫(kù),以確保數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù)正確、有效、相容。
數(shù)據(jù)完整性(Data Integrity)保證的是數(shù)據(jù)的精確(Accuracy)和可靠性(Reliability)。
正確和相容(外鍵約束)
數(shù)據(jù)完整性主要分三類:
實(shí)體完整性
參照完整性
用戶定義的完整性
就是根據(jù)定義的一組(多個(gè))規(guī)則,RDBMS實(shí)現(xiàn)對(duì)數(shù)據(jù)完整性的保證。
實(shí)體完整性和參照完整性是關(guān)系模型必須滿足的完整性約束條件,稱為關(guān)系的兩個(gè)不變性,應(yīng)該由關(guān)系系統(tǒng)自動(dòng)支持。
用戶定義的完整性是應(yīng)用領(lǐng)域需要遵循的約束條件,體現(xiàn)的是具體領(lǐng)域、具體業(yè)務(wù)和需求場(chǎng)景中要滿足的約束。
實(shí)體完整性(Entity Integrity)
實(shí)體代表了現(xiàn)實(shí)世界中實(shí)際存在事、物、人或抽象的概念。
這就要求實(shí)體是客觀存在的,是可分辨可區(qū)分的。比如現(xiàn)實(shí)中的兩個(gè)學(xué)生,是可區(qū)分的,這是兩個(gè)不同的個(gè)體;兩個(gè)相同型號(hào)的手機(jī),也是可分辨的兩個(gè)不同的物體。
當(dāng)將兩個(gè)學(xué)生、兩個(gè)手機(jī)不同的客體的相關(guān)數(shù)據(jù),從現(xiàn)實(shí)空間映射到數(shù)據(jù)空間時(shí),就是兩條記錄。這兩條記錄也應(yīng)該是可區(qū)分的。
如何區(qū)分關(guān)系中的兩個(gè)實(shí)體或兩個(gè)記錄?是通過(guò)關(guān)系的碼。
實(shí)體的完整性,就是對(duì)關(guān)系的碼做出要求,即不能取空值。
關(guān)系的主屬性不能取空值。必須是確定的唯一的值,否則無(wú)法區(qū)分兩條記錄。
空值,NULL,在數(shù)據(jù)庫(kù)中表示一種特殊值,它表示“不知道”或“不確定”或“無(wú)意義,不存在”的特殊狀態(tài)。
由于“不知道”、“不確定”,所有任何值和NULL進(jìn)行操作的結(jié)果都是NULL,都是不確定。
舉例
比如"選修"關(guān)系中:選修(學(xué)號(hào),課程號(hào),成績(jī))。
“學(xué)號(hào)、課程號(hào)”為主碼,這兩個(gè)屬性都不能取空值。
參照完整性
參照完整性
參照完整性指的是關(guān)系與關(guān)系之間的聯(lián)系,即表與表之間的聯(lián)系,通常對(duì)應(yīng)表中的外鍵約束或外鍵引用。
通過(guò)關(guān)系中屬性的值(即列的值)來(lái)關(guān)聯(lián)不同的關(guān)系實(shí)體。
比如:專業(yè)實(shí)體、學(xué)生實(shí)體及它們之間一對(duì)多的聯(lián)系。
學(xué)生關(guān)系引用了專業(yè)關(guān)系的主碼“專業(yè)號(hào)”;學(xué)生關(guān)系中的“專業(yè)號(hào)”的值必須是確實(shí)存在的專業(yè)的“專業(yè)號(hào)”。
再比如:學(xué)生、課程、學(xué)生與課程之間的多對(duì)多聯(lián)系
再比如:學(xué)生實(shí)體及其內(nèi)部的一對(duì)多聯(lián)系
“學(xué)號(hào)”是主碼,“班長(zhǎng)”是外碼,它引用了本關(guān)系的“學(xué)號(hào)”。
“班長(zhǎng)” 必須是確實(shí)存在的學(xué)生的學(xué)號(hào)。
外碼(Foreign Key)
外碼對(duì)應(yīng)數(shù)據(jù)庫(kù)中表的外鍵。
設(shè)
如果
基本關(guān)系
稱為參照關(guān)系(Referencing Relation)R 基本關(guān)系
稱為被參照關(guān)系(Referenced Relation)或目標(biāo)關(guān)系(Target Relation)S

自引用的屬性也是外碼。比如學(xué)生中的“班長(zhǎng)”與“學(xué)號(hào)”對(duì)應(yīng)。“班長(zhǎng)”是外碼;學(xué)生關(guān)系既是參照關(guān)系也是被參照關(guān)系。
外碼并不一定要與相應(yīng)的主碼同名。不是自引用的參照完整性,通常外碼與主碼都會(huì)取相同的名字,便于識(shí)別。
參照完整性的規(guī)則
若屬性(或?qū)傩越M)
或者取空值(F的每個(gè)屬性值均為空值)
或者等于S中某個(gè)元組的主碼值
也就是,外碼(外鍵)要么取空值,要么取引用的表的主碼(主鍵)值,或碼的值。
現(xiàn)代RDBMS中,外鍵通常也都支持引用表的碼屬性,而不一定是主鍵,比如唯一約束的列。
外碼(外鍵)可以去空值的原因在于,它并不用于區(qū)分標(biāo)識(shí)實(shí)體的唯一,不用于區(qū)分不同的實(shí)體,取空值不影響實(shí)體完整性。空值表示參照關(guān)系中的這個(gè)元組(實(shí)體)在外碼(外鍵)屬性上的值暫時(shí)未知,即字段值未知的狀態(tài)。
舉例
學(xué)生關(guān)系中每個(gè)元組的“專業(yè)號(hào)”屬性只取兩類值:
(1)空值,表示尚未給該學(xué)生分配專業(yè)
(2)非空值,這時(shí)該值必須是專業(yè)關(guān)系中某個(gè)元組的“專 業(yè)號(hào)”值,即該學(xué)生不可能分配一個(gè)不存在的專業(yè)。
用戶定義的完整性
用戶定義的完整性,針對(duì)的是某一個(gè)具體使用的數(shù)據(jù)庫(kù)中的約束條件。反映的是具體應(yīng)用、具體業(yè)務(wù)或場(chǎng)景,涉及的數(shù)據(jù)必須滿足的要求。
這類約束的實(shí)現(xiàn),可以放在應(yīng)用層完成檢查校驗(yàn);也可以由關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),提供對(duì)這類完整性定義、實(shí)現(xiàn)和檢驗(yàn)的機(jī)制,由數(shù)據(jù)庫(kù)系統(tǒng)層統(tǒng)一管理和處理,減少應(yīng)用程序的負(fù)擔(dān)。
實(shí)體完整性(主鍵)和參照完整性(外鍵)約束,也都是由數(shù)據(jù)庫(kù)系統(tǒng)層提供的約束機(jī)制。
舉例:
非主屬性“課程名”不能取空值,且是唯一值?!皩W(xué)分”屬性只能取值{1,2,3,4}
參考
主要參考自《數(shù)據(jù)庫(kù)系統(tǒng)概論(基礎(chǔ)篇)》
作者:代碼迷途
鏈接:https://juejin.cn/post/7001652363094294535
來(lái)源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
