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

下載本文檔

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

文檔簡介

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

溫馨提示

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

最新文檔

評論

0/150

提交評論