2012年5月23日 1
第十章 数据库完整性
2012年5月23日 2
概述
什么是数据库的完整性
数据的正确性和相容性
防止不合语义的数据进入数据库
例 : 学生的年龄必须是整数,取值范围为 14--29 ;
学生的性别只能是男或女;
学生的学号一定是唯一的;
学生所在的系必须是学校开设的系。
2012年5月23日 3
完整性控制机制
1. 完整性约束条件定义机制
完整性约束条件:数据模型的组成部分约束数据库中数据的
语义
DBMS 应提供定义数据库完整性约束条件,并把它们作为模
式的一部分存入数据库中
2. 完整性检查机制
检查用户发出的操作请求是否违背了完整性约束条件
3. 违约反应
如果发现用户的操作请求使数据违背了完整性约束条件,则
采取一定的动作来保证数据的完整性
2012年5月23日 4
10.1 完整性约束条件
完整性约束条件作用的对象
列:对属性的取值类型、范围、精度等的约束条件
元组:对元组中各个属性列间的联系的约束
关系:对若干元组间、关系集合上以及关系之间的联
系的约束
两种状态
静态 : 对静态对象的约束是反映数据库状态合理性的
约束
动态 : 对动态对象的约束是反映数据库状态变迁的约
束,新旧值之间满足的约束
2012年5月23日 5
完整性约束条件分类
六类
对象状态
动态列级 动态元组 动态关系
动态 ④ ⑤ ⑥
静态列级 静态元组 静态关系
静态 ① ② ③
列 元组 关系 对象
粒度
2012年5月23日 6
静态列级约束
对列的取值域的说明
最常见、最简单、最容易实现的一类完整性约束
五类静态列级约束
1) 数据类型约束:数据的类型、长度、单位、精度等
2) 对数据
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
的约束:如日期为 YY.MM.DD
3) 取值范围或取值集合的约束
4) 对空值的约束:未定义或未知的值,与零值和空格不同
5) 其他约束:如关于列的排序说明,组合列等
2012年5月23日 7
静态元组约束
规定元组的各个列之间的约束关系
例:订货关系中发货量 <= 订货量
教师关系中教授的工资 >=700 元
静态元组约束只局限在元组上
2012年5月23日 8
静态关系约束
关系的各个元组之间或若干关系之间存在的各种
联系或约束
常见静态关系约束:
实体完整性约束
参照完整性约束
函数依赖约束:关系字段间存在的函数依赖
统计约束:定义某个字段值与一个关系中多个元
组的统计值之间的约束关系
2012年5月23日 9
动态列级约束
动态列级约束是修改列定义或列值时应满足的约束条
件
1) 修改列定义时的约束
例:将原来允许空值的列改为不允许空值时 :
该列目前已存在空值,则拒绝这种修改
2) 修改列值时的约束
修改列值时新旧值之间要满足的约束条件
例:职工工资调整 >= 原来工资
年龄只能增长
2012年5月23日 10
动态元组、关系约束
动态元组约束
修改元组值 : 各个字段之间要满足的约束条件
例 : 职工工资调整不得低于其原来工资 + 工龄 *1.5
动态关系约束
关系变化前后状态:限制条件
例:事务一致性、原子性等约束条件
2012年5月23日 11
完整性约束条件小结
粒 度
状态 列 级 元 组 级 关 系 级
静 态
列定义
· 类型
· 格式
· 值域
· 空值
元组值应满足的
条件
实体完整性约束
参照完整性约束
函数依赖约束
统计约束
动 态
改变列定
义或列值
元组新旧值之间应
满足的约束条件
关系新旧状态间应
满足的约束条件
2012年5月23日 12
10.2 完整性控制
定义功能
一个完善的完整性控制机制应该允许用户定义各类完整性约束条件
检查功能
立即执行的约束:语句执行完后立即检查是否违背完整性约束
延迟执行的约束:完整性检查延迟到整个事务执行结束后进行
违约反应
拒绝该操作
其他处理方法
2012年5月23日 13
例子
例:银行数据库中“借贷总金额应平衡”的约束
就应该是延迟执行的约束
从账号 A 转一笔钱到账号 B 为一个事务,从账号 A
转出去钱后账就不平了,必须等转入账号 B 后账
才能重新平衡,这时才能进行完整性检查。
2012年5月23日 14
完整性规则五元组表示
(D , O, A, C, P)
D( Data ):约束作用的数据对象
O( Operation ):触发完整性检查的数据库操作
当用户发出什么操作请求时需要检查该完整性规则是立即检查
还是延迟检查;
A ( Assertion ):数据对象必须满足的断言或语义约束,这是规
则的主体;
C( Condition ):选择 A作用的数据对象值的谓词
P ( Procedure ):违反完整性规则时触发的过程
2012年5月23日 15
例子
实例 学号不能为空 教授工资不得低于 1000元
数据对象 D 约束作用的对象为 Sno属性
约束作用的对象为工资
Sal属性
操作 O 插入或修改 Student 元
组时 插入或修改职工元组时
断言 A Sno不能为空 Sal不能小于 1000
谓词 C 无( A可作用于所有记
录的 Sno属性)
职称=‘教授’ (A 仅作
用于职称=‘教授’的记
录 )
过程 P 拒绝执行该操作 拒绝执行该操作
2012年5月23日 16
关系系统三类完整性的实现
关系数据库系统都提供了定义和检查实体完整性、
参照完整性和用户定义的完整性的功能
违反实体完整性规则和用户定义的完整性规则的操
作:
一般是拒绝执行
违反参照完整性的操作:
拒绝执行
接受这个操作,同时执行一些附加的操作,以保
证数据库的状态正确
2012年5月23日 17
参照完整性的实现
RDBMS 实现参照完整性时需要考虑
外码是否可以接受空值的问题
在被参照关系中删除元组时的问题
在参照关系中插入元组时的问题
修改关系中主码的问题
2012年5月23日 18
1. 外码是否可以接受空值的问题
例 1 :在职工-部门数据库中, EMP关系包含有外码 Deptno
某元组的这一列若为空值,表示这个职工尚未分配到任何具
体的部门工作,和应用环境的语义是相符
例 2 :学生-选课数据库, Student关系为被参照关系,其主码
为 Sno。 SC为参照关系,外码为 Sno
若 SC的 Sno为空值:表明尚不存在的某个学生,或者某个
不知学号的学生,选修了某门课程,其成绩
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
在 Grade中
,与学校的应用环境是不相符的,因此 SC的 Sno列不能取
空值。
2012年5月23日 19
2. 在被参照关系中删除元组时的问题
出现违约操作的情形:
删除被参照关系的某个元组( student ),而参照关系
有若干元组 (SC) 的外码值与被删除的被参照关系的主
码值相同
违约反应:可有三种策略
级联删除(CASCADES)
受限删除(RESTRICTED)
置空值删除( NULLIFIES)
这三种处理方法,哪一种是正确的,要依应用环
境的语义来定
2012年5月23日 20
三种策略
级联删除
将参照关系中外码值与被参照关系中要删除元组主码
值相对应的元组一起删除
受限删除
当参照关系中没有任何元组的外码值与要删除的被参
照关系的元组的主码值相对应时,系统才执行删除操
作,否则拒绝此删除操作
置空值删除
删除被参照关系的元组,并将参照关系中与被参照关
系中被删除元组主码值相等的外码值置为空值
2012年5月23日 21
例子
例:要删除 Student关系中 Sno=950001 的元组,而 SC关
系中有 4 个元组的 Sno 都等于 950001 。
级联删除:将 SC关系中所有 4 个 Sno=950001 的元
组一起删除。如果参照关系同时又是另一个关系的被参
照关系,则这种删除操作会继续级联下去
受限删除:系统将拒绝执行此删除操作
置空值删除:将 SC关系中所有 Sno=950001 的元组
的 Sno值置为空值。
在学生选课数据库中,显然第一种方法和第二种方法都是
对的。第三种方法不符合应用环境语义
2012年5月23日 22
3. 在参照关系中插入元组时的问题
出现违约操作的情形
需要在参照关系中插入元组,而被参照关系不存在
相应的元组
违约反应
受限插入:仅当被参照关系中存在相应的元组,其
主码值与参照关系插入元组的外码值相同时,系统
才执行插入操作,否则拒绝此操作
递归插入:首先向被参照关系中插入相应的元组,
其主码值等于参照关系插入元组的外码值,然后向
参照关系插入元组
2012年5月23日 23
例子
例:向 SC关系插入( 99001 , 1 , 90)元组,而
Student关系中尚没有 Sno=99001 的学生
受限插入:系统将拒绝向 SC关系插入
( 99001 , 1 , 90)元组
递归插入:系统将首先向 Student关系插入
Sno=99001 的元组,然后向 SC关系插入
( 99001 , 1 , 90)元组
2012年5月23日 24
4. 修改被参照关系中主码的问题
两种策略
不允许修改主码
允许修改主码
违约操作
♦ 要修改被参照关系中某些元组的主码值,而参照关系中有些
元组的外码值正好等于被参照关系要修改的主码值,如修改
student学号
♦ 要修改参照关系中某些元组的主码值,而被参照关系中没有
任何元组的外码值等于被参照关系修改后的主码值,如修改
SC中的学号
2012年5月23日 25
允许修改主码策略
违约反应 1-修改的关系是被参照关系:与删除类似
级联修改
修改被参照关系中主码值同时,用相同的方法修改参照
关系中相应的外码值
受限修改
拒绝此修改操作。只当参照关系中没有任何元组的外码
值等于被参照关系中某个元组的主码值时,这个元组的
主码值才能被修改
置空值修改
修改被参照关系中主码值,同时将参照关系中相应的外
码值置为空值
2012年5月23日 26
例子
例:将 Student关系中 Sno=950001 的元组中 Sno值改为
960123 。而 SC关系中有 4 个元组的 Sno=950001
级联修改:将 SC关系中 4 个 Sno=950001 元组中的 Sno
值也改为 960123 。如果参照关系同时又是另一个关系的被
参照关系,则这种修改操作会继续级联下去。
受限修改:只有 SC中没有任何元组的 Sno=950001 时,才
能修改 Student 表中 Sno=950001 的元组的 Sno值改为
960123 。
置空值修改:将 Student 表中 Sno=950001 的元组的 Sno
值改为 960123 。而将 S表中所有 Sno=950001 的元组的
Sno值置为空值。
在学生选课数据库中只有第一种方法是正确的
2012年5月23日 27
允许修改主码策略
违约反应 (2)-修改的关系是参照关系:与插入类似
受限插入
递归插入
2012年5月23日 28
参照完整性的实现
RDBMS 在实现参照完整性时
需要向用户提供定义主码、外码的机制
向用户提供按照自己的应用要求选择处
理依赖关系中对应的元组的方法
页 1
页 2
页 3
页 4
页 5
页 6
页 7
页 8
页 9
页 10
页 11
页 12
页 13
页 14
页 15
页 16
页 17
页 18
页 19
页 20
页 21
页 22
页 23
页 24
页 25
页 26
页 27
页 28