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










网友评论