数据库完整性(实体完整性,参照完整性,用户定义完整性)
數(shù)據(jù)庫(kù)完整性:
指數(shù)據(jù)庫(kù)中數(shù)據(jù)的正確性、相容性
- 正確性:保證進(jìn)入數(shù)據(jù)庫(kù)的數(shù)據(jù)是符合語(yǔ)義約束的合法數(shù)據(jù)
- 相容性:同一個(gè)事實(shí)的兩個(gè)數(shù)據(jù)應(yīng)當(dāng)是一致的
?
?為了維護(hù)數(shù)據(jù)庫(kù)的定義完整性:
DBMS必須具備三個(gè)功能:(完整性定義、檢查控制、違約處理都是由DBMS來(lái)完成)
(1)提供定義完整性條件約束的機(jī)制(實(shí)體完整性,參照完整性,用戶定義完整性)
(2)提供完整性檢查的方法(一般在 insert 、update 、delete、等語(yǔ)句執(zhí)行后檢查)
(3)違約處理?
完整性約束條件的分類
①就被約束的數(shù)據(jù)對(duì)象而言,完整性約束又可以分為如下表所示的四種類型
約束類型?? ?含義?? ?
類型/域約束?? ?說(shuō)明給定類型的合法取值?? ?用戶自定義的完整性
屬性約束? ? ? ? ?說(shuō)明屬性的合法取值?? ?用戶自定義的完整性
關(guān)系約束? ? ? ? ?說(shuō)明關(guān)系的合法取值?? ?實(shí)體完整性/用戶自定義的完整性
數(shù)據(jù)庫(kù)約束?? ?說(shuō)明數(shù)據(jù)庫(kù)的合法取值,通常涉及多個(gè)關(guān)系?? ?實(shí)體完整性/用戶自定義的完整性
②從約束的狀態(tài)的角度,約束還可以分靜態(tài)約束和動(dòng)態(tài)約束
靜態(tài)約束是關(guān)于數(shù)據(jù)庫(kù)正確狀態(tài)的約束
動(dòng)態(tài)約束是數(shù)據(jù)庫(kù)從一種正確狀態(tài)轉(zhuǎn)移到另一種狀態(tài)的轉(zhuǎn)移約束
實(shí)體完整性(兩個(gè)關(guān)系的不變性之一):
關(guān)系模型的實(shí)體完整性在 create table? 中用 primary key (主鍵) 定義。
單屬性構(gòu)成的碼有兩種說(shuō)明方法:(1)定義列級(jí)約束條件 (2)定義表級(jí)約束條件
多屬性構(gòu)成的碼只有一種說(shuō)明方法 : 定義表級(jí)約束條件
建議都使用表級(jí)約束條件!(可使條件更加清晰)
①實(shí)體完整性定義:
每個(gè)關(guān)系應(yīng)該有一個(gè)主碼(可唯一標(biāo)識(shí)表中的一條記錄),每個(gè)元組的主碼值惟一確定該元組
主碼的任何屬性都不能取空值
②違反實(shí)體完整性規(guī)則的操作
插入(insert)新元組時(shí)可能破壞實(shí)體完整性規(guī)則(DBMS自動(dòng)檢查主碼是否為空)
修改(updata)元組的主碼時(shí)可能破壞實(shí)體完整性規(guī)則(DBMS自動(dòng)檢查主碼是否為空)
DBMS應(yīng)該自動(dòng)檢查是否導(dǎo)致違反實(shí)體完整性約束,并拒絕導(dǎo)致破壞實(shí)體完整性約束的任何插入或修改
SQL支持實(shí)體完整性。用戶只需要在創(chuàng)建基本表時(shí)說(shuō)明關(guān)系的主碼,系統(tǒng)就能夠自動(dòng)地保證實(shí)體完整性
?
參照完整性 ( P46 ) :實(shí)現(xiàn)這種引用規(guī)則(一對(duì)一,多對(duì)多),要求外碼的取值只是被參照表主碼的值或者取空值
關(guān)系模型的參照完整性在 create table 中用 foreign key 短語(yǔ)定義那些列為外碼
用 references 短語(yǔ)指明這些外碼參照哪些表的主碼
foreign key (A1,...,An) references <外表名> (<外表主碼>) [<參照觸發(fā)動(dòng)作>] --指出修改和刪除違反參照完整性約束時(shí)觸發(fā)的動(dòng)作;缺省時(shí),違反參照完整性的修改和刪除將被拒絕 --參照觸發(fā)動(dòng)作可以是以下兩種 on update <參照動(dòng)作> [on delete <參照動(dòng)作>] on delete <參照動(dòng)作> [on update <參照動(dòng)作>] --參照動(dòng)作可以是拒絕、級(jí)聯(lián)、置空值、置缺省值之一--關(guān)系SC中(Sno,Cno)是主碼。Sno,Cno分別參照Student表的主碼和Course表的主碼定義SC中的參照完整性 create table SC(Sno char(9) not null,Cno char(4) not null,Grade int,primary key (Sno, Cno), /*在表級(jí)定義實(shí)體完整性*/foreign key (Sno) references Student(SNO), /*在表級(jí)定義參照完整性*/foreign key (Cno) references Course(Cno) /*在表級(jí)定義參照完整性*/);
①參照完整性規(guī)則:
參照關(guān)系R的任何元組在其外碼FKR上的值或者等于被參照關(guān)系S的某個(gè)元組在主碼Ks上的值,或者為空值
②違反參照完整性的更新
向參照表(外鍵(foreign key)在的表,如:Sno , Cno)關(guān)系R中插入元組
修改參照表關(guān)系R外碼上的值
刪除被參照表(在 references 后面的表,如:Student)關(guān)系S的元組
修改被參照表(在 references 后面的表,如:Course)關(guān)系S主碼上的值
③違約處理(違背完整性約束條件)
向參照關(guān)系R插入元組:拒絕( 默認(rèn) )
修改參照關(guān)系R外碼上的值:拒絕( 默認(rèn) )
刪除被參照關(guān)系S的元組:拒絕/級(jí)聯(lián)( cascade )刪除/置空值( set-null )/置缺省值
修改被參照關(guān)系S主碼上的值:拒絕/級(jí)聯(lián)刪除( cascade )/置空值( set-null )/置缺省值
④SQL中的參照完整性
外碼可以在創(chuàng)建基本表時(shí)用FOREIGN KEY子句說(shuō)明, 形式為:
FOREIGN KEY (A1,…, Ak) REFERENCES <外表名> (<外表主碼>) [<參照觸發(fā)動(dòng)作>]
<參照觸發(fā)動(dòng)作>指:當(dāng)修改和刪除違反參照完整性約束時(shí)觸發(fā)的動(dòng)作( 缺省值,違反參照完整性的修改和刪除將被拒絕 )
<參照觸發(fā)動(dòng)作>可以是如下兩種形式之一:
ON UPDATE <參照動(dòng)作> [ON DELETE <參照動(dòng)作>] ON
DELETE <參照動(dòng)作> [ON UPDATE <參照動(dòng)作>]
其中<參照動(dòng)作>可以是CASCADE、SET NULL、SET DEFAULT和NO ACTION 之一,分別表示級(jí)聯(lián)、置空值、置缺省值和拒絕
ON DELETE <參照動(dòng)作>缺省時(shí),違反參照完整性的刪除將被拒絕
ON UPDATE<參照動(dòng)作>缺省時(shí),違反參照完整性的修改將被拒絕
eg:
如果我們希望在更新Students元組的主碼時(shí)同時(shí)修改相應(yīng)的SC元組的外碼Sno,刪除Students的元組時(shí)同時(shí)刪除相應(yīng)的SC元組;
而更新Courses的元組時(shí)同時(shí)修改相應(yīng)的SC元組的外碼Cno,但不允許刪除Courses的元組破壞參照完整性,則我們可以用如下語(yǔ)句創(chuàng)建基本表SC:
CREATE TABLE SC (Sno CHAR (9) not null,Cno CHAR (5) not null,Grade SMALLINT CHECK (Grade>=0 AND Grade<=100),PRIMARY KEY (Sno,Cno),/*主鍵*/FOREIGN KEY(外鍵) (Sno) REFERENCES Students(參照學(xué)生表) (Sno) ON UPDATE CASCADE /*級(jí)聯(lián)刪除SC表中對(duì)應(yīng)的元組*/ON DELETE CASCADE, /*級(jí)聯(lián)更新SC表中對(duì)應(yīng)的元組*/FOREIGN KEY (Cno) REFERENCES Courses (Cno) ON UPDATE CASCADE ); /*當(dāng)刪除course表中的元組造成了SC表不一致時(shí)拒絕刪除*/用戶定義完整性:
用戶定義的完整性就是針對(duì)某一具體應(yīng)用的數(shù)據(jù)必須滿足的語(yǔ)義要求。
DBMS提供了定義和檢驗(yàn)這類完整性的機(jī)制,使用了和實(shí)體完整性、參照完整性相同的方法來(lái)處理他們,而不必由應(yīng)用程序承擔(dān)。
屬性上的約束條件的定義
屬性列:
(1)列值非空(not null)
(2)列值唯一 ( unique )
(3)檢查列值是否滿足一個(gè)條件表達(dá)式( check )
1、不允許取空值
在定義的列的后面 + not null?
例: 在定義Stdent表時(shí) ,Sname 、Ssex 不允許取空值
2、列值唯一
在定義的列的后面 + unique?
例:建立部門表Dept ,要求部門名稱 Dname 列取值唯一,部門編號(hào)Deptno列為主碼(學(xué)院名不能重名)
3、用check 短語(yǔ)指定列值應(yīng)該滿足的條件
例:性別只允許 男 或 女?
sage? char(2)check( Ssex in ( ‘男’ ,‘ 女 ’ )?)男和女是常量表達(dá)式,需要使用單引號(hào)定界
sage?smallint check (sage between 18 and 50)(年齡區(qū)間就這么寫)
元組上的約束條件的定義:( 表級(jí)約束 )
在create table 時(shí)可以用 check 短語(yǔ)定義元組上的約束條件
元組級(jí)的限制可以設(shè)置不同屬性之間的取值的相互約束條件
例:當(dāng)學(xué)生的性別時(shí)男時(shí),姓名不能以 Ms. 開(kāi)頭
check(Ssex = ' 女 ' or Sname not null like ' Ms. %?')邏輯或的關(guān)系
即:性別時(shí)女時(shí),什么開(kāi)頭都可以,當(dāng)性別是 男時(shí)第一個(gè)條件不滿足,就需要看滿足第二個(gè)條件,不能以Ms. 開(kāi)頭。
用戶自定義的約束條件檢查和違約處理
插入元組或修改屬性的值時(shí),rdbms檢查定義的約束跳進(jìn)啊是否被滿足,如果不滿足則操作被拒絕執(zhí)行。
總結(jié)
以上是生活随笔為你收集整理的数据库完整性(实体完整性,参照完整性,用户定义完整性)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2021-5-8字符串作业
- 下一篇: mybatis collection 子