5.1物體完整性
?
5.1.1 定義物體完整性
對單屬性構成的碼有兩種說明方法,一種是定義為列級約束條件,另一種是定義為表級約束條件,對多個屬性構成的碼只有一種說明方法,即定義表級約束條件,
例 5.2 將SC表中的Sno,Cno屬性組定義為碼,
CREATE TABLE SC
( Sno CHAR (9) NOT NULL,
Cno CHAR (4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno,Cno)
);
?
5.1.2 物體完整性檢查和違約處理
(1)檢查主碼值是否唯一,如果不唯一則拒絕插入或修改,
(2)檢查主碼的各個屬性是否為空,只要有一個為空就拒絕插入或修改,
?
5.2 參照完整性
?
5.2.1 定義參照完整性
例如,關系SC中一個元組表示ー個學生選修的某門課程的成績,(Sno,Cno)是主碼,Sno、Cno分別參照參考 Student表的主碼和 Course表的主碼,
例 5.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) /*在表級定義參照完整性*/
);
?
5.2.2 參照完整性檢查和違約處理
(1)SC表中增加一個元組,該元組的Sno屬性值Student在表中找不到一個元組,其Sno屬性值與之相等,
(2)修改SC表中的一個元組,修改后該元組的Sno屬性值在表 Student中找不到一個中找不到一個元組,其Sno屬性值與之相等,
(3)從 Student表中洗掉一個元組,造成C表中某些元組的Sno屬性值在表 Student,
(4)修改Student表中一個元組的Sno屬性,造成sc表中某些元組的Sno屬性值在表 Student中找不到一個元組,其Sno屬性值與之相等,
當上述的不一致發生時,系統可以采用以下策略加以處理,
(1)拒絕(NO ACTION)執行
不允許該操作執行,該策略一般設定為默認策略,
(2)級聯(CASCADE)操作
當洗掉或修改被參照表(Student)的一個元組導致與參照表(SC)的不一致時,洗掉或修改參照表中的所有導致不一致的元組,
例如,洗掉 Student表中Sno值為"201215121"的元組,則從要SC表中級聯洗掉SC.Sno='201215121’的所有元組,
(3)設定為空值
當洗掉或修改被參照表的一個元組時造成了不一致,則將參照表中的所有造成不一致的元組的對應屬性設定為空值,例如,有下面兩個關系:
學生(學號,姓名,性別,專業號,年齡)
專業(專業號,專業名)
其中學生關系的“專業號”是外碼,因為專業號是專業關系的主碼,
假設專業表中某個元組被洗掉,專業號為12,按照設定為空值的策略,就要把學生表中專業號=12的所有元組的專業號設定為空值,這對應了這樣的語意:某個專業洗掉了,該專業的所有學生專業未定,等待重新分配專業,
?
5.3 用戶定義的完整性
?
5.3.1屬性上的約束條件
1.屬性上約束條件的定義
列值非空(NOT NULL)
列值唯一(UNIQUE)
檢查列值是否滿足一個條件運算式(CHECK短語)
?
例 5.7 Student表的Ssex只允許取“男”或“女”,
CREATE TABLE Student
( Sno CHAR(9) PRIMARY KEY, //在列級定義主碼
Sname CHAR(8) NOT NULL, //Sname屬性不允許取空值
Ssex CHAR(2) CHECK(Ssex IN('男','女')), //性別屬性Ssex只允許'男'或'女'
Sage SMALLINT,
Sdept CHAR(20)
);
?
2.屬性上約束條件的檢查和違約處理
當往表中插入元組或修改屬性的值時,關系資料庫管理系統將檢查屬性上的約束條件是否被滿足,如果不滿足則操作被拒絕執行,
?
5.3.2 元組上約束條件的定義
例 5.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兩個屬性值之間的約束條件*/
);
性別是女性的元組都能通過該項 CHECK檢查,因為Ssex=女成立;當性別是男性時,要通過檢查則名字一定不能以Ms打頭,因為Ssex='男’時,條件要想為真值,Sname NOT LIKE Ms.%必須為真值,
2.元組上約束條件的檢查和違約處理
當往表中插入元組或修改屬性的值時,關系資料庫管理系統將檢查元組上的約束條件是否被滿足,如果不滿足則操作被拒絕執行,
?
5.4 完整性約束命名子句
SQ L在 CREATE TABLE 陳述句中提供了完整性約束命名子句CONSTRAINT,用來對完整性約束條件命名,從而可以靈活地增加、洗掉一個完整性約束條件,
1.完整性約束命名子句
CONSTRAINT <完整性約束條件名> <完整性約束條件>
<完整性約束條件>包括 NOT NULL、UNIQUE、PRIMARY KEY、CHECK短語等,
CREATE TABLE Student
(Sno NUMERIC
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這4個列級約束,
?
2.修改表中的完整性約束
可以使用 ALTER TABLE 陳述句修改表中的完整性限制,
例 5.13 修改表Student中的約束條件,要求學號改為在900000~999999之間,年齡由小于30改為小于40,
ALTER TABLE
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);
先刪后改,不能直接修改
?
5.6 斷言(ASSERTION)
1.創建斷言的語法格式
CREATE ASSERTION <斷言名> <CHECK 子句>
每個斷言都被賦予一個名字,<CHECK 子句>中的約束條件與WHERE子句的條件運算式類似,
例 5.18 限制資料庫課程最多60名選手選修,
CREATE ASSERTION ASSE_SC_DB_NUM
CHECK(60>=(SELECT count(*)
FROM Course,SC WHERE SC.CNO=COURSE.CNO AND COURSE.CNAME='資料庫'));
每當學生選修課程時,將在SC表中插入一條元組(Sno,Cno,NULL),ASSE_SC_ DB_NUM斷言被觸發檢查,如果選修資料庫課程的人數已經超過60人, CHECK子句回傳值為“假”,對SC表的插入操作被拒絕,
?
2.洗掉斷言的陳述句格式
DROP ASSERTION <斷言名>;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/277734.html
標籤:其他
上一篇:無
