第五章 数据库完整性
目的:防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据。
一、实体完整性
定义:
主码是否唯一、主属性不能取空值。
列级约束条件:在列后面定义约束
表级约束条件:在属性最后面定义约束
多个属性组成的码只能用表级约束条件。
完整性检查和违约处理:
主码是否唯一(全表扫描 | 索引)、主属性不能取空值。
二、参照完整性
定义:
foreign key定义哪些为外码
references指明这些代码参照哪些表的主码。
完整性检测和违约处理:
参照表修改外键或插入元组时,被参照表一般执行拒绝的策略。
被参照表删除元组或修改主码值时,参照表可以执行(拒绝、级联、设置为null值)的操作。
拒绝是默认策略
三、用户定义的完整性
属性上的约束条件的定义
not null、
unique、
check:检查列值是否满足一个布尔表达式,如下
Ssex char[2] check (Ssex in ('男','女'))
在插入数据或者修改属性值时,RDBMS检测属性上的约束条件是否被满足,若不满足则拒绝执行。
元组上的约束条件的定义
定义:用check短语定义元组上的约束条件,可以设置不同属性之间的取值的相互约束条件。
约束条件检查和违约处理:插入元组或者修改属性的值时,检查元组上的约束条件是否被满足,若不满足,则拒绝执行。
四、完整性约束命名子句
constraint约束,跟在列属性或者表属性后面都可以
constraint <完整性约束条件名>
primary key | foreign key | check
修改完整型约束命名子句。
删除
alter table student
drop constraint C1;
添加
alter table student
add constraint C2 check();
五、域中的完整性限制
domain
create domain genderdomain char(2)
check (value in ('男','女'));
前面的
ssex check(ssex in ('男','女'))
可以改为
ssex genderdomain
在域中对限制命名:
六、触发器
用户定义在表上的一类由事件驱动的特殊过程,服务器自动激活。