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