第五章 数据库完整性
数据库的 完整性 是指数据的 正确性 和 相容性。
数据库必须具有以下的功能
1)提供定义完整性
2)和完整性检查的机制
3)违约方法
1、 静态列级约束
静态列级约束:对的取值域的说明
最常见、最简单、最容易实现的一类完整性约束
1)数据类型约束:数据的类型、长度、单位、精度等
2) 对数据格式的约束
3) 取值范围或取值集合的约束
4) 对空值的约束
5) 其他约束
例:关于列的排序说明,组合列等
2. 静态元组约束
规定元组的各个列之间的约束关系
例:订货关系中发货量<=订货量
教师关系中教授的工资>=700元
静态元组约束只局限在元组上
3. 静态关系约束
关系的各个元组之间或若干关系之间存在的各种联系或约束. 常见静态关系约束:
- 实体完整性约束参照完整性约束函数依赖约束统计约束
4、动态列级约束
动态列级约束是修改列定义或列值时应满足的约束条件
1) 修改列定义时的约束
例:将原来允许空值的列改为不允许空值时:
该列目前已存在空值,则拒绝这种修改
2) 修改列值时的约束
修改列值时新旧值之间要满足的约束条件
例:职工工资调整 >= 原来工资
年龄只能增长
RDBMS实现参照完整性时需要考虑以下4方面:
- 外码是否可以接受空值的问题
外码是否能够取空值:依赖于应用环境的语义
实现参照完整性:
系统提供定义外码的机制
定义外码列是否允许空值的机制
2.在被参照关系中删除元组时的问题
出现违约 *** 作的情形:
删除被参照关系的某个元组(student)
而参照关系有若干元组(SC)的外码值与被删除的被参照关系的主码值相同
违约反应:可有三种策略
级联删除(CASCADES)
删除外码的时候,如果有以该外码为主码的元组一并删除
受限删除(RESTRICTED)
删除该外码的时候,也会删除以该外码为主码的元组,但是只有在该元组为空的时候才会删除。否则拒绝此删除 *** 作。
置空值删除(NULLIFIES)
删除被参照关系的元组,并将参照关系中与被参照关系中被删除元组主码值相等的外码值置为空值。
这三种处理方法,哪一种是正确的,要依应用环境的语义来定
3.在参照关系中插入元组时的问题
出现违约 *** 作的情形
需要在参照关系中插入元组,而被参照关系不存在相应的元组
违约反应
受限插入
仅当被参照关系中存在相应的元组,其主码值与参照关系插入元组的外码值相同时,系统才执行插入 *** 作,否则拒绝此 *** 作。
递归插入
首先向被参照关系中插入相应的元组,其主码值等于参照关系插入元组的外码值,然后向参照关系插入元组。
4、修改被参照关系中主码的问题
两种策略
(1)不允许修改主码
(2)允许修改主码
违约 *** 作
要修改被参照关系中某些元组的主码值,而参照关系中有些元组的外码值正好等于被参照关系要修改的主码值要修改参照关系中某些元组的主码值,而被参照关系中没有任何元组的外码值等于被参照关系修改后的主码值
违约反应 (1)
修改的关系是被参照关系:与删除类似
级联修改
修改被参照关系中主码值同时,用相同的方法修改参照关系中相应的外码值。受限修改
拒绝此修改 *** 作。只当参照关系中没有任何元组的外码值等于被参照关系中某个元组的主码值时,这个元组的主码值才能被修改。置空值修改
修改被参照关系中主码值,同时将参照关系中相应的外码值置为空值。
违约反应 (2)
修改的关系是参照关系:与插入类似
受限插入
仅当参照关系中含有要插入的外码的时候,被参照关系才可以插入元组递归插入
向被参照关系中插入新的元组的时候,参照关系会自动插入相关的外码,并且其他的元素置为空值,如果有其他的关系也有外码,会一直递归插入下去。
RDBMS在实现参照完整性时:
需要向用户提供定义主码、外码的机制
向用户提供按照自己的应用要求选择处理依赖关系中对应的元组的方法
三、自定义的完整性
空值、唯一、check短语
Ssex char(2) check(Ssex in('男','女'); Grade smallint check(Grade >= 0 and Grade <= 100);
自定义元组约束
check短语
....check (Sex = '女' or Sname not like 'Ms.%');
自定义约束命名子句
用constraint子句:
constraint c1 check(sal + deduct >= 3000) #cl 为自定义的约束名,有点向宏定义,能够为 *** 作起别名 constraint teacherFKey Foreign Key(Deptno) References Dept(Deptno);
触发器
触发器是一种存储的过程,由三种条件(UPDATE,DELETE,INSERT)之一的组合来触发。
定义触发器。
Create trigger 触发器名 {before|after} <触发事件> on <表名>Referencing New|Old row as <变量> For each{row|statement} [when<触发条件>]
<触发动作体> 其中,Referencing指出引用的变量。
例子
create trigger SC_T after Update of Grade on SC; Create trigger Student_Count After insert on Student Create trigger Insert_or_Update_Sal Before INsert or update on Teacher Referencing New row as newTuple for each row Begin if (newTuple.Job = '教授') and (newTuple.sal < 8000) then newTuple.Sal:=8000;
敲完才明白触发器是用来用户自定义完整性的呀~o( ̄▽ ̄)ブ
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)