第5章 数据库完整性
数据库的完整性是指数据的正确性和相容性
数据库的正确性是指数据是符合现实世界语义、反映当前实际情况的;数据的相容性是指数据库同一对象在不同关系表中的数据是符合逻辑的。
数据的完整性是为了防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据。数据的安全性是保护数据库防止恶意破坏和非法存取,因此,完整性检查和控制的防范对象是不合语义的、不正确的数据,防止他们进入数据库,安全性控制的防范对象是非法用户和非法操作,防止他们对数据库数据的非法存取。
为了维护数据库的完整性,数据库管理系统必须能够实现:
- 提供定义完整性约束条件的机制
- 实体完整性
- 参照完整性
- 用户定义完整性
- 提供完整性检查的方法
- 进行违约处理
5.1 实体完整性
关系模型的实体完整性,是指在基本表中主属性不能取空值
create table中用primary key定义(主码)
单属性构成的码有两种说明方法
- 定义为列级约束条件
- 定义为表级约束条件
对多个属性构成的码只有一种说明方法
- 定义为表级约束条件
上述 primary key中的sno和cno都不能为空
5.1.2 实体完整性检查和违约处理
- 检查主码值是否唯一,如果不唯一 则拒绝插入或修改
- 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
- 拒绝插入或修改是违约处理
- 检查记录的方法有全表扫描和索引检查
5.2 参照完整性
5.2.1 参照完整性定义
关系模型的参照完整性定义
5.2.2 参照完整性检查和违约处理
对被参照表和参照表进行增删改操作时有可能破坏参照完整性,必须进行检查以保证这两个表的相容性
参照完整性是指在基本表中,外码可以是空值或另一个关系主码的有效值。
- SC表中增加一个元组,该元组的Sno属性值在表Student中找不到一个元组,其Sno属性值与之相等。
- 修改SC表中的一个元组,修改后该元组的Sno属性值在表Student中找不到一个元组,其Sno属性值与之相等。
- 从Student表中删除一个元组,造成SC表中某些元组的Sno属性值在表Student中找不到一个元组,其Sno属性值与之相等。
- 修改Student表中一个元组的Sno属性,造成SC表中某些元组的Sno属性值在表Student中找不到一个元组,其Sno属性值与之相等。
当上述的不一致发生时,系统可以采用以下策略加以处理。
- 拒绝执行
- 级联操作
- 设置为控制
5.3 用户定义的完整性
5.3.1 属性上的约束条件:
-
列值非空(NOT NULL)
- 列值唯一(UNIQUE)
- 检查列值是否满足一个条件表达式(CHECK)
5.3.2 元组上的约束条件
5.4 完整性约束命名子句
定义:
constraint <完整性约束条件名><完整性约束条件>
修改:
DROP/ADD
5.5 域中完整性限制
5.6断言
5.7 触发器
触发器是用户定义在关系表上的一类由事件驱动的特殊过程。
定义
激活
- 执行该表上的before触发器
- 激活触发器的SQL语句
- 执行该表上的after触发器
对同一个表上的多个before/after触发器,遵循“谁先创建谁先执行”的原则
习题:
1什么是数据库的完整性?
数据库的完整性是指数据的正确性和相容性。
2 .数据库的完整性概念与数据库的安全性概念有什么区别和联系?
数据的完整性和安全性是两个不同的概念,但是有一定的联系。前者是为了防止数据库中存在不符合语义的数据,防止错误信息的输入和输出,即所谓垃圾进垃圾出( Garba : e In Garba : e out )所造成的无效操作和错误结果。后者是保护数据库防止恶意的破坏和非法的存取。也就是说,安全性措施的防范对象是非法用户和非法操作,完整性措施的防范对象是不合语义的数据。
3 .什么是数据库的完整性约束条件?可分为哪几类?
完整性约束条件是指数据库中的数据应该满足的语义约束条件。一般可以分为六类:静态列级约束、静态元组约束、静态关系约束、动态列级约束、动态元组约束、动态关系约束。
静态列级约束是对一个列的取值域的说明,包括以下几个方面: ( l )对数据类型的约束,包括数据的类型、长度、单位、精度等; ( 2 )对数据格式的约束; ( 3 )对取值范围或取值集合的约束; ( 4 )对空值的约束; ( 5 )其他约束。
静态元组约束就是规定组成一个元组的各个列之间的约束关系,静态元组约束只局限在单个元组上。
静态关系约束是在一个关系的各个元组之间或者若干关系之间常常存在各种联系或约束。
常见的静态关系约束有: ( l )实体完整性约束; ( 2 )参照完整性约束; ( 3 )函数依赖约束。
动态列级约束是修改列定义或列值时应满足的约束条件,包括下面两方面: ( l )修改列定义时的约束; ( 2 )修改列值时的约束。
动态元组约束是指修改某个元组的值时需要参照其旧值,并且新旧值之间需要满足某种约束条件。
动态关系约束是加在关系变化前后状态上的限制条件,例如事务一致性、原子性等约束条件。
4 . DBMS 的完整性控制机制应具有哪些功能?
DBMS 的完整性控制机制应具有三个方面的功能:
( l )定义功能,即提供定义完整性约束条件的机制;
( 2 )检查功能,即检查用户发出的操作请求是否违背了完整性约束条件;
( 3 )违约反应:如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性。
5 . RDBMS 在实现参照完整性时需要考虑哪些方面?
关系数据库管理系统在实现参照完整性时需要考虑以下几个方面:
- ( l )外码是否可以接受空值。
- ( 2 )册 l 除被参照关系的元组时的考虑,这时系统可能采取的作法有三种:
- l )级联删除( CASCADES ) ;
- 2 )受限删除( RESTRICTED ) ;
- 3 )置空值删除( NULLIFIES )。
- ( 3 )在参照关系中插入元组时的问题,这时系统可能采取的作法有: l )受限插入; 2 )递归插入。
- ( 4 )修改关系中主码的问题。一般是不能用 UPDATE 语句修改关系主码的。如果需要修改主码值,只能先删除该元组,然后再把具有新主码值的元组插入到关系中。如果允许修改主码,首先要保证主码的惟一性和非空,否则拒绝修改。然后要区分是参照关系还是被参照关系。
6.关系系统中,当操作违反实体完整性、参照完整性和用户定义的完整性约束条件时,一般是如何分别进行处理的?
对于违反实体完整性和用户定义的完整性的操作一般都采用拒绝执行的方式进行处理。
而对于违反参照完整性的操作,并不都是简单地拒绝执行,有时要根据应用语义执行一些附加的操作,以保证数据库的正确性。