完整性约束:
保证授权用户对数据库所做的修改不会破坏数据的一致性;防止对数据的意外破坏
单个关系上的约束:
类型 | 含义 | 例 |
---|---|---|
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')));