數(shù)據(jù)庫系統(tǒng)及應用12.ppt_第1頁
數(shù)據(jù)庫系統(tǒng)及應用12.ppt_第2頁
數(shù)據(jù)庫系統(tǒng)及應用12.ppt_第3頁
數(shù)據(jù)庫系統(tǒng)及應用12.ppt_第4頁
數(shù)據(jù)庫系統(tǒng)及應用12.ppt_第5頁
已閱讀5頁,還剩65頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第十二章 數(shù)據(jù)庫完整性,在數(shù)據(jù)庫投入運行后,應該保證數(shù)據(jù)庫中的數(shù)據(jù)是正確的,避免非法的更新。數(shù)據(jù)庫中的數(shù)據(jù)發(fā)生錯誤,往往是由非法的更新引起的。,數(shù)據(jù)庫的完整性(Integrity): 數(shù)據(jù)庫的完整性是指保證數(shù)據(jù)庫中數(shù)據(jù)的正確性(Correctness)、準確性(Accuracy)和有效性(Validity),防止不合語義的數(shù)據(jù)進入數(shù)據(jù)庫。,例如:學生的年齡必須是整數(shù),取值范圍為14-29; 學生的性別只能是男或女; 學生的學號一定是唯一的; 學生所在的系必須是學校開設的系;,為維護數(shù)據(jù)庫的完整性,DBMS必須提供一種機制來檢查數(shù)據(jù)庫的完整性,看其是否滿足語義規(guī)定的條件。 DBMS中檢查數(shù)據(jù)是否滿足完整性條件的機制稱為完整性檢查。,現(xiàn)代數(shù)據(jù)庫技術采用對數(shù)據(jù)完整性的語義約束和檢查來保護數(shù)據(jù)庫的完整性,其實現(xiàn)方式有兩種:一種是通過定義和使用完整性約束規(guī)則(系統(tǒng)定義),另一種是通過觸發(fā)器(Trigger)和存儲過程(Stored Procedure)(用戶自定義)等過程來實現(xiàn)。,完整性子系統(tǒng):負責處理數(shù)據(jù)庫的完整性語義約束的定義和檢查,防止因錯誤的更新操作產(chǎn)生的不一致性。用戶可以使用完整性保護機制,對某些數(shù)據(jù)規(guī)定一些語義約束。 當進行數(shù)據(jù)操作時,DBMS就由某個完整性語義約束的觸發(fā)條件激發(fā)相應的檢查程序,進行完整性語義約束檢查。 若發(fā)現(xiàn)錯誤的更新操作,立即采取措施處理,或是拒絕執(zhí)行該更新操作,或是發(fā)出警告信息,或者糾正已產(chǎn)生的錯誤。,DBMS的完整性子系統(tǒng)是負責數(shù)據(jù)庫的完整性控制的。它具有3個功能: 完整性約束條件定義機制 完整性檢查機制 違約反應,完整性約束條件:數(shù)據(jù)模型的組成部分,約束數(shù)據(jù)庫中數(shù)據(jù)的語義。 DBMS應提供定義數(shù)據(jù)庫完整性約束條件的機制,并把它們作為模式的一部分存入數(shù)據(jù)庫中。 一般由SQL的DDL語句來實現(xiàn)。,完整性約束條件定義機制,檢查用戶發(fā)出的操作請求是否違背了完整性約束條件的方法,完整性檢查機制,如果發(fā)現(xiàn)用戶的操作請求使數(shù)據(jù)違背了完整性約束條件,則采取一定的動作,如拒絕用戶執(zhí)行該操作,來保證數(shù)據(jù)的完整性。,違約反應,12.1 完整性規(guī)則,數(shù)據(jù)庫完整性子系統(tǒng)是根據(jù)“完整性規(guī)則集”工作的。完整性規(guī)則集包含一組完整性約束規(guī)則(Integrity Constraint)。一個完整性約束規(guī)則包含完整性約束條件、規(guī)則的觸發(fā)條件和“ELSE子句”。 完整性檢查是圍繞完整性約束條件進行的,因此數(shù)據(jù)庫的完整性約束條件是完整性控制機構的核心。,一個完整性約束條件可以看作是一個謂詞(Predicate),所有正確的保持完整性的數(shù)據(jù)庫狀態(tài)都應當滿足這個謂詞。 例如,SCORE.GRADE0。 規(guī)則的觸發(fā)條件規(guī)定何時使用該規(guī)則做檢查。 “ELSE子句”規(guī)定當完整性約束條件不滿足時須做的操作。,完整性約束條件作用的對象可以是關系、元組和列三種。 屬性(列)約束:列的類型、取值范圍、精度、排序等約束; 元組約束:元組中各個屬性列間的聯(lián)系的約束; 關系約束:若干元組間、關系集合上以及關系之間的聯(lián)系的約束;,在關系數(shù)據(jù)庫中,數(shù)據(jù)的完整性規(guī)則一般有以下類型。 域完整性規(guī)則:定義屬性的取值范圍; 關系完整性規(guī)則:定義更新操作對數(shù)據(jù)庫中的值的影響和限制; 實體完整性約束:定義在一個關系中,主屬性不能取空值 參照完整性約束:定義在一個或多個關系中,屬性值間的聯(lián)系、影響和約束。,這些規(guī)則是用DDL描述的,一旦一條完整性規(guī)則輸入給系統(tǒng),系統(tǒng)就開始執(zhí)行這條規(guī)則。這種方法的主要優(yōu)點是由系統(tǒng)處理違反規(guī)則的情況,而不是由用戶處理。其次,規(guī)則集中存放在數(shù)據(jù)字典中,當需要修改時,可以很方便地修改。,定義域約束規(guī)定某個屬性的值必須符合某種數(shù)據(jù)類型并且取自某個數(shù)據(jù)定義域。域完整性約束施加于單個數(shù)據(jù)上。 0人的年齡150 倉庫庫存量0 0一個月的工作天數(shù)31 長途電話號碼格式為9999999999,1. 域完整性約束,對關系的完整性進行約束的主要目的是維持用戶規(guī)定的函數(shù)依賴。例如,如果用戶定義了下列函數(shù)依賴:NAMEADDRESS。,2. 關系完整性約束,主碼(主關鍵字)是實體完整性約束(Entity Constraint)。,3. 實體完整性約束,外碼(外部關鍵字)是參照完整性約束(Referential Constraint)的一個典型例子。,4. 參照完整性約束,數(shù)據(jù)庫的完整性約束可以分為兩種類型。 靜態(tài)約束(Static Constraint) 動態(tài)約束(Dynamic Constraint),靜態(tài)約束:是對數(shù)據(jù)庫狀態(tài)的約束,即是指數(shù)據(jù)庫每一確定狀態(tài)時的數(shù)據(jù)對象所應滿足的約束條件,反映數(shù)據(jù)庫狀態(tài)合理性的約束,這是最重要的一類完整性約束。 例如,在一個人事管理數(shù)據(jù)庫的任何一個狀態(tài)都必須滿足條件 “0人的年齡150”。,動態(tài)約束:是指數(shù)據(jù)庫從一種狀態(tài)轉變?yōu)榱硪环N狀態(tài)時,新、舊值之間所應滿足的約束條件,反映數(shù)據(jù)庫狀態(tài)變遷的約束。 例如,一個人的年齡只會增加,不會減少,更新年齡數(shù)據(jù)時必須滿足此約束。,在關系系統(tǒng)中,最重要的完整性約束是實體完整性約束和參照完整性約束,其他完整性約束條件則可以歸入用戶定義的完整性約束。 對于違反實體完整性和用戶定義的完整性操作一般都采用拒絕執(zhí)行的方式進行處理,而對于違反參照完整性的操作,并不都是簡單地拒絕執(zhí)行,有時要根據(jù)應用語義執(zhí)行一些附加的操作,以保證數(shù)據(jù)庫的正確性。,12.2 完整性控制機制,關系模型的實體完整性 CREATE TABLE中用PRIMARY KEY定義 單屬性構成的碼有兩種說明方法 定義為列級約束條件 定義為表級約束條件 對多個屬性構成的碼只有一種說明方法 定義為表級約束條件,12.2.1 實體完整性,例12.1 將Student表中的Sno屬性定義為碼 (1) 在列級定義主碼 CREATE TABLE Student (Sno CHAR(5) PRIMARY KEY, Sname CHAR(20) NOT NULL, Ssex CHAR(2) , Sage NUMBER(2), Sdept CHAR(2);,(2) 在表級定義主碼 CREATE TABLE Student (Sno CHAR(5), Sname CHAR(20) NOT NULL, Ssex CHAR(2) , Sage NUMBER(2), Sdept CHAR(2), PRIMARY KEY (Sno) );,例12.2 將SCore表中的Sno,Cno屬性組定義為碼。 CREATE TABLE SCORE (Sno CHAR(5) , /* NOT NULL */ Cno CHAR(3) , /* NOT NULL */ Score NUMBER(6,2) , PRIMARY KEY (Sno,Cno) /*只能在表級定義主碼*/ );,插入或對主屬性列進行更新操作時,RDBMS按照實體完整性規(guī)則自動進行檢查。包括: 檢查主碼值是否唯一,如果不唯一則拒絕插入或修改 檢查主碼的各個屬性是否為空,只要有一個為空就拒絕插入或修改,12.2.2 參照完整性,關系模型的參照完整性 在CREATE TABLE中用FOREIGN KEY短語定義哪些列為外碼 用REFERENCES短語指明這些外碼參照哪些表的主碼,例如,關系SCore中一個元組表示一個學生選修的某門課程的成績,(Sno,Cno)是主碼。Sno,Cno分別參照引用Student表的主碼和Course表的主碼。 例12.3 定義SCore中的參照完整性 CREATE TABLE Score (Sno CHAR(5) , Cno CHAR(3) , Score NUMBER(6,2), PRIMARY KEY (Sno,Cno), /*在表級定義實體完整性*/ FOREIGN KEY (Sno) REFERENCES Student(Sno), /*在表級定義參照完整性*/ FOREIGN KEY (Cno) REFERENCES Course(Cno) /*在表級定義參照完整性*/ );,參照完整性違約處理 拒絕(RESTRICT)執(zhí)行 默認策略 級聯(lián)(CASCADE)操作 設置為空值(SET NULL) 對于參照完整性,除了應該定義外碼,還應定義外碼列是否允許空值,在實現(xiàn)參照完整性時,系統(tǒng)除了應該提供定義外碼的機制,還應提供定義外碼列是否允許空值的機制。,1. 外碼能否接受空值的問題,職工表,部門表,外碼,空值,可 能符合語義,成績表,學生表,外碼,空值,不 符合語義,2. 可能破壞參照完整性的情況及違約處理,在被參照關系中刪除元組的問題 外碼值與被參照關系刪除元組的主碼值相同,這時可有三種不同的策略: 級聯(lián)刪除(CASCADES) 將參照關系中所有外碼值與被參照關系中要刪除元組的主碼值(父項)相同的元組一起刪除。如果參照關系同時又是另一個關系的被參照關系,則這種刪除操作會繼續(xù)級聯(lián)下去。, 限制刪除(RESTRICT) 僅當參照關系中沒有任何元組的外碼值與被參照關系中要刪除元組的主碼值(父項)相同時,系統(tǒng)才執(zhí)行刪除操作,否則拒絕執(zhí)行此刪除操作。 置空值刪除(SET NULL) 刪除被參照關系中的元組,并將參照關系中相應元組的外碼值置成空值。,這三種方法究竟應采取哪一種方法,要依具體應用環(huán)境的語義來定。如在學生- 選課數(shù)據(jù)庫中,顯然刪除學生信息時采用“級聯(lián)刪除”方法是對的。因為當一個學生畢業(yè)或退學后,他的個人記錄從Student表中刪除了,他的成績記錄也應隨之從Score表中刪除。,例:要刪除Student關系中Sno=95001的元組,而SCORE關系中有4個元組的Sno都等于95001。 級聯(lián)刪除:將SCORE關系中所有4個Sno=95001的元組一起刪除。如果參照關系同時又是另一個關系的被參照關系,則這種刪除操作會繼續(xù)級聯(lián)下去,受限刪除:系統(tǒng)將拒絕執(zhí)行此刪除操作。 置空值刪除:將SCORE關系中所有Sno=95001的元組的Sno值置為空值。 在學生選課數(shù)據(jù)庫中,顯然第一種方法和第二種方法都是對的。第三種方法不符合應用環(huán)境語義。,在參照關系中插入元組時的問題 一般地,當參照關系(子表)插入某個元組,依據(jù)被參照關系(父表)的情況,這時可以有以下策略:, 限制插入 僅當被參照關系中存在相應的元組,其主碼值與參照關系插入元組的外碼值相同時,系統(tǒng)才執(zhí)行插入操作,否則拒絕執(zhí)行此操作。 遞歸插入(僅是理論上) 首先向被參照關系中插入相應的元組,其主碼值等于參照關系插入元組的外碼值,然后向參照關系插入元組。,例:向SCORE關系插入(99001,001,90)元組,而Student關系中尚沒有Sno=99001的學生 受限插入:系統(tǒng)將拒絕向SCORE關系插入(99001,001,90)元組 遞歸插入:系統(tǒng)將首先向Student關系插入Sno=99001的元組,然后向SCORE關系插入(99001,001,90)元組。,修改被參照關系時的問題 不允許修改主碼值 在有些RDBMS中,修改主碼值的操作時不允許的。如果需要修改主碼值,只能先刪除該元組,然后再把具有新主碼值的元組插入到關系中。 允許修改主碼值 在有些RDBMS中,允許修改關系的主碼值,但必須保證主碼值的唯一性和非空,否則拒絕修改。分兩種情況:,必須檢查參照關系,是否存在這樣的元組,其外碼值等于被參照關系要修改的主碼值。這時可以有級聯(lián)修改、拒絕修改、置空值修改三種策略加以選擇,級聯(lián)修改 修改被參照關系中主碼值同時,用相同的方法修改參照關系中相應的外碼值。 受限修改 拒絕此修改操作。只當參照關系中沒有任何元組的外碼值等于被參照關系中某個元組的主碼值時,這個元組的主碼值才能被修改。 置空值修改 修改被參照關系中主碼值,同時將參照關系中相應的外碼值置為空值。,例:將Student關系中Sno=95001的元組中Sno值改為96123。而SCORE關系中有4個元組的Sno=95001 級聯(lián)修改:將SCORE關系中4個Sno=95001元組中的Sno值也改為96123。如果參照關系同時又是另一個關系的被參照關系,則這種修改操作會繼續(xù)級聯(lián)下去。,受限修改:只有SCORE中沒有任何元組的Sno=95001時,才能修改Student表中Sno=95001的元組的Sno值改為96123。 置空值修改:將Student表中Sno=95001的元組的Sno值改為96123。而將Student表中所有Sno=95001的元組的Sno值置為空值。 在學生選課數(shù)據(jù)庫中只有第一種方法是正確的。,與在子表插入元組時的問題類似 必須檢查被參照關系,是否存在這樣的元組,其主碼值等于被參照關系要修改的外碼值。這時可以有限制插入、遞歸插入兩種策略加以選擇。,修改參照關系時的問題,RDBMS在實現(xiàn)參照完整性 需要向用戶提供定義主碼、外碼的機制 向用戶提供按照自己的應用要求選擇處理依賴關系中對應的元組的方法 選擇哪種策略,都要根據(jù)應用環(huán)境的要求確定。,3. 參照完整性的實現(xiàn),12.2.3 用戶定義的完整性,用戶定義的完整性就是針對某一具體應用的數(shù)據(jù)必須滿足的語義要求 RDBMS提供,而不必由應用程序承擔,CREATE TABLE時定義 列值非空(NOT NULL) 列值唯一(UNIQUE) 檢查列值是否滿足一個布爾表達式(CHECK),1. 屬性上的約束條件的定義, 不允許取空值 例12.4 在定義SC表時,說明Sno、Cno、Grade屬性不允許取空值。 CREATE TABLE Score (Sno CHAR(5) , Cno CHAR(3) , Score NUMBER(6, 2) NOT NULL, PRIMARY KEY (Sno, Cno), /* 如果在表級定義實體完整性,隱含了Sno,Cno不允許取空值,則在列級不允許取空值的定義就不必寫了 * / );, 列值唯一 例12.5 建立部門表DEPT,要求部門名稱Dname列取值唯一,部門編號Deptno列為主碼 CREATE TABLE DEPT (Deptno NUMERIC(2), Dname CHAR(9) UNIQUE,/*要求Dname列值唯一*/ Location CHAR(10), PRIMARY KEY (Deptno) );, 用CHECK短語指定列值應該滿足的條件 例12.6 Student表的Ssex只允許取“男”或“女”。 CREATE TABLE Student (Sno CHAR(5) PRIMARY KEY, Sname CHAR(8) NOT NULL, Ssex CHAR(2) CHECK (Ssex IN (男,女) ) , /*性別屬性Ssex只允許取男或女 */ Sage NUMBER(3), Sdept CHAR(2) );,插入元組或修改屬性的值時,RDBMS檢查屬性上的約束條件是否被滿足 如果不滿足則操作被拒絕執(zhí)行,2. 屬性上的約束條件檢查和處理,在CREATE TABLE時可以用CHECK短語定義元組上的約束條件,即元組級的限制 同屬性值限制相比,元組級的限制可以設置不同屬性之間的取值的相互約束條件,3. 元組上的約束條件的定義,例12.7 當學生的性別是男時,其名字不能以Ms.打頭。 CREATE TABLE Student (Sno CHAR(5), Sname CHAR(8) NOT NULL, Ssex CHAR(2), Sage NUMBER(2), Sdept CHAR(20), PRIMARY KEY (Sno), CHECK (Ssex=女 OR Sname NOT LIKE Ms.%) /*定義了元組中Sname和 Ssex兩個屬性值之間的約束條件*/ ); 性別是女性的元組都能通過該項檢查,因為Ssex=女成立; 當性別是男性時,要通過檢查則名字一定不能以Ms.打頭,插入元組或修改屬性的值時,RDBMS檢查元組上的約束條件是否被滿足 如果不滿足則操作被拒絕執(zhí)行,4. 元組上的約束條件檢查和違約處理,除此之外,還可以通過定義觸發(fā)器來實現(xiàn)其他完整性規(guī)則。用觸發(fā)器可定義很復雜的完整性約束條件。 一旦某一用戶定義了一個完整性約束條件檢查的觸發(fā)器,任何用戶對該數(shù)據(jù)的增、刪、改操作均由服務器自動激活相應的觸發(fā)器,在核心層進行集中的完整性控制。,12.3 完整性約束命名子句,SQL3主張顯式命名所有的約束。約束可以命名,以便引用。約束的命名使用保留字CONSTRAINT。 CONSTRAINT PRIMARY KEY短語 |FOREIGN KEY短語 |UNIQUE |CHECK短語,1. CONSTRAINT 約束命名,例12.8 建立學生登記表Student,要求學號在9000099999之間,姓名不能取空值,年齡小于30,性別只能是“男”或“女”。 CREATE TABLE Student (Sno CHAR(5) CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999), Sname CHAR(20) CONSTRAINT C2 NOT NULL, Sage NUMBER(3) CONSTRAINT C3 CHECK (Sage 30), Ssex CHAR(2) CONSTRAINT C4 CHECK (Ssex IN ( 男,女), CONSTRAINT StudentKey PRIMARY KEY(Sno) ); 在Student表上建立了5個約束條件,包括主碼約束(命名為StudentKey)以及C1、C2、C3、C4四個列級約束。,使用ALTER TABLE語句修改表中的完整性約束,2. 修改表中的完整性限制,例12.9 修改表Student中的約束條件,要求學號改為在900000999999之間,年齡由小于30改為小于40。 可以先刪除原來的約束條件,再增加新的約束條件 ALTER TABLE Student DROP CONSTRAINT C1; ALTER TABLE Student ADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000 AND 999999), ALTER TABLE Student DROP CONSTRAINT C3; ALTER TABLE Student ADD CONSTRAINT C3 CHECK (Sage 40);,12.4 ORACLE的完整性約束,Oracle在CREATE TABLE 語句中提供了PRIMARY KEY子句,供用戶在建表時指定關系中的主關鍵字列。 當用戶程序對主關鍵字列進行更新操作時,系統(tǒng)自動進行完整性檢查

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論