資料庫,資料庫學習
資料庫的完整性
資料的正確性和相容性
資料的完整性和安全性是兩個不同概念
資料的完整性
防止資料庫中存在不符合語義的資料,也就是防止資料庫中存在不正確的資料
防範對象:不合語義的、不正確的資料
資料的安全性
保護資料庫防止惡意的破壞和非法的存取
防範對象:非法使用者和非法操作
為維護資料庫的完整性,DBMS必須:
1.提供定義完整性條件約束條件的機制
2.提供完整性檢查的方法
3.違約處理
實體完整性
實體完整性定義
關聯式模式的實體完整性
CREATE TABLE中用PRIMARY KEY定義
單屬性構成的碼有兩種說明方法
定義為資料行層級條件約束條件
定義為表級約束條件
對多個屬性構成的碼只有一種說明方法
定義為表級約束條件
[例1] 將Student表中的Sno屬性定義為碼 (1)在列級定義主碼 CREATE TABLE Student (Sno CHAR(9) PRIMARY KEY, Sname CHAR(20) NOT NULL, Ssex CHAR(2) , Sage SMALLINT, Sdept CHAR(20));
(2)在表級定義主碼 CREATE TABLE Student (Sno CHAR(9), Sname CHAR(20) NOT NULL, Ssex CHAR(2) , Sage SMALLINT, Sdept CHAR(20), PRIMARY KEY (Sno) );
[例2]將SC表中的Sno,Cno屬性群組定義為碼 CREATE TABLE SC (Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT, PRIMARY KEY (Sno,Cno) /*只能在表級定義主碼*/ );
實體完整性檢查和違約處理
插入或對主碼列進行更新操作時,RDBMS按照實體完整性規則自動進行檢查。包括:
1. 檢查主碼值是否唯一,如果不唯一則拒絕插入或修改
2. 檢查主碼的各個屬性是否為空白,只要有一個為空白就拒絕插入或修改
參照完整性
參照完整性定義
關聯式模式的參照完整性定義
在CREATE TABLE中用FOREIGN KEY短語定義哪些列為外碼
用REFERENCES短語指明這些外碼參照哪些表的主碼
例如,關係SC中一個元組表示一個學生選修的某門課程的成績,(Sno,Cno)是主碼。Sno,Cno分別參照引用Student表的主碼和Course表的主碼 [例3] 定義SC中的參照完整性 CREATE TABLE SC (Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT, PRIMARY KEY (Sno, Cno), /*在表級定義實體完整性*/ FOREIGN KEY (Sno) REFERENCES Student(Sno), /*在表級定義參照完整性*/ FOREIGN KEY (Cno) REFERENCES Course(Cno) /*在表級定義參照完整性*/ );
參照完整性檢查和違約處理
參照完整性違約處理
[例4] 顯式說明參照完整性的違約處理樣本 CREATE TABLE SC (Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT, PRIMARY KEY(Sno,Cno), FOREIGN KEY (Sno) REFERENCES Student(Sno) ON DELETE CASCADE /*串聯刪除SC表中相應的元組*/ ON UPDATE CASCADE, /*串聯更新SC表中相應的元組*/ FOREIGN KEY (Cno) REFERENCES Course(Cno) ON DELETE NO ACTION /*當刪除course 表中的元組造成了與SC表不一致時拒絕刪除*/ ON UPDATE CASCADE /*當更新course表中的cno時,串聯更新SC表中相應的元組*/ );
使用者定義的完整性就是針對某一具體應用的資料必須滿足的語義要求
RDBMS提供,而不必由應用程式承擔
屬性上的約束條件的定義
CREATE TABLE時定義列值非空(NOT NULL)列值唯一(UNIQUE)檢查列值是否滿足一個布林運算式(CHECK)
1.不允許取空值 [例5] 在定義SC表時,說明Sno、Cno、Grade屬性不允許取空值。 CREATE TABLE SC (Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT NOT NULL, PRIMARY KEY (Sno, Cno), /* 如果在表級定義實體完整性,隱含了Sno,Cno不允許取空值,則在列級不允許取空值的定義就不必寫了 * / );
2.列值唯一 [例6] 建立部門表DEPT,要求部門名稱Dname列取值唯一,部門編號Deptno列為主碼 CREATE TABLE DEPT (Deptno NUMERIC(2), Dname CHAR(9) UNIQUE,/*要求Dname列值唯一*/ Location CHAR(10), PRIMARY KEY (Deptno) );
3. 用CHECK短語指定列值應該滿足的條件[例7] Student表的Ssex只允許取“男”或“女”。 CREATE TABLE Student (Sno CHAR(9) PRIMARY KEY, Sname CHAR(8) NOT NULL, Ssex CHAR(2) CHECK (Ssex IN (‘男’,‘女’) ) , /*性別屬性Ssex只允許取'男'或'女' */ Sage SMALLINT, Sdept CHAR(20) );
屬性上的約束條件檢查和違約處理
插入元組或修改屬性的值時,RDBMS檢查屬性上的約束條件是否被滿足
如果不滿足則操作被拒絕執行
元組上的約束條件的定義
在CREATE TABLE時可以用CHECK短語定義元組上的約束條件,即元組級的限制
同屬性值限制相比,元組級的限制可以設定不同屬性之間的取值的相互約束條件
[例9] 當學生的性別是男時,其名字不能以Ms.打頭。 CREATE TABLE Student (Sno CHAR(9), Sname CHAR(8) NOT NULL, Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20), PRIMARY KEY (Sno), CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%') /*定義了元組中Sname和 Ssex兩個屬性值之間的約束條件*/ );性別是女性的元組都能通過該項檢查,因為Ssex=‘女’成立;當性別是男性時,要通過檢查則名字一定不能以Ms.打頭
CONSTRAINT 約束CONSTRAINT <完整性條件約束條件名>[PRIMARY KEY短語 |FOREIGN KEY短語 |CHECK短語]
[例10] 建立學生登記表Student,要求學號在90000~99999之間,姓名不能取空值,年齡小於30,性別只能是“男”或“女”。 CREATE TABLE Student (Sno NUMERIC(6) CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999), Sname CHAR(20) CONSTRAINT C2 NOT NULL, Sage NUMERIC(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四個資料行層級條件約束。
[例13] 修改表Student中的約束條件,要求學號改為在900000~999999之間,年齡由小於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);