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