完整性約束:
保證授權用戶對數據庫所做的修改不會破壞數據的一致性;防止對數據的意外破壞
單個關系上的約束:
類型 | 含義 | 例 |
---|---|---|
not null 約束 |
已聲明為主碼的屬性,不必顯式聲明為not null
|
create table stu(name, varchar(20) not null); |
unique 約束 |
unique(A, B, C) 指明A, B, C構成候選碼;即:關系中的任意兩個元組不能在所列屬性上取值相同,但可以為null (除非已顯式指明為not null ) |
unique(name, addr) |
check 子句 |
check(P) 指明:關系中每個元組都必須滿足此謂詞P
|
create table section(semester varchar(6), check(semester in ('Fall', 'Summer', 'Spring', 'Winter'))) |
參照完整性
令關系r
和s
的屬性集分別是R
和S
,主碼分別是K_r
和K_s
。如果要求對s
中任意元組p
,均存在r
中元組t
使得t.K_s = p.ALPHA
,我們稱S
的子集ALPHA
為參照關系r
中K_r
的外碼(foreign key)
以上稱為參考完整性約束,或子集依賴
create table(
...
dept_name varchar(20) references department
...);
以上代碼,當違反參照完整性約束時,處理為拒絕執行導致完整性破壞的操作(即:此事務被回滾)
create table course(
...
foreign key (dept_name) references department
on delete cascade
on update set null
on insert set default,
...);
以上代碼,
- 當刪除department元組操作違反參照完整性約束時,系統并不拒絕此操作,而是“級聯”刪除course關系中相應元組;
- 當更新department元組操作違反參照完整性約束時,系統并不拒絕此操作,而是參照域(此處為dept_name)設為
null
; - 當插入department元組操作違反參照完整性約束時,系統并不拒絕此操作,而是參照域(此處為dept_name)設為預設值。
assertion
create assertion credits_earned_constraint check
(not exists ( select ID
from student
where tot_credits <> (select sum(credits)
from takes natural join course
where student.ID = takes.ID
and grade is not null
and grade <> 'F')));