日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库完整性(实体完整性,参照完整性,用户定义完整性)

發(fā)布時間:2024/3/12 数据库 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库完整性(实体完整性,参照完整性,用户定义完整性) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

數(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。