第五章 数据库完整性

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

所谓静态约束是指数据库每一确定状态时的数据 对象所应满足的约束条件,它是反映数据库状态 合理性的约束,这是最重要的一类完整性约束。 动态约束是指数据库从一种状态转变为另一种状 态时,新、旧值之间所应满足的约束条件,它反 映数据库状态变迁的约束。
5.1 完整性约束条件
对象状态 动态列级约束 动态 ④ 静态列级约束 静态 ① 动态元组约束 ⑤ 静态元组约束 ② 动态关系约束 ⑥ 静态关系约束 ③
动态
元组新旧值 关系新旧状态 之间应满足 之间应满足的 的约束件条 约束条件
5.2 完整性控制 DBMS的完整性控制机制应具有三个方面的功能:

定义功能,提供定义完整性约束条件的机制。

检查功能,检查用户发出的操作请求是否违背 了完整性约束条件。 如果发现用户的操作请求使数据违背了完整性 约束条件,则采取一定的动作来保证数据的完 整性。
5.2 完整性控制
在关系数据库管理系统中,最重要的完整性约束是实 体完整性和参照完整性,其它完整性约束条件则可以 归入用户定义的完整性。
目前许多关系数据库管理系统都提供了定义和检查实 体完整性、参照完整性和用户定义完整性的功能。
对于违反实体完整性和用户定义完整性的操作一般都 采用拒绝执行的方式进行处理。 而对于违反参照完整性的操作,并不都是简单地拒绝 执行,有时要根据应用语义执行一些附加操作,以保 证数据库的正确性。 下面我们来讨论一下关系数据库管理系统在实现参照 完整性要考虑的几个问题:

级联删除(CASCADES) 将参照关系中所有外码值与被参照关系中要删 除元组主码值相同的元组一起删除。例如将上 面Sc关系中4个Sno=95001的元组一起删除。如 果参照关系同时又是另一个关系的被参照关系, 则这种删除操作会继续级联下去。
5.2.2 完整性控制

受限删除(RESTRICTED) 仅当参照关系中没有任何元组的外码值与被参 照关系中要删除元组主码值相同时,系统才执 行删除操作,否则拒绝此操作。例如对于上面 的情况,系统将拒绝删除Student关系中 Sno=95001的元组。
5.2 数据库完整性
为维护数据库的完整性,DBMS必须提供一种 机制来检查数据库中的数据,看其是否满足语 义规定的条件。 这些加在数据库数据之上的语义约束条件称为 数据库完整性约束条件,它们作为模式的一部 分存放入数据库中。
而DBMS中检查数据是否满足完整性条件的机 制称为完整性检查。
5.1 完整性约束条件 完整性检查是围绕完整性约束条件进行的,因此 完整性约束条件是完整性控制机制的核心。
C(Condition) 选择A作用的数据对象值的谓词; P(Procedure) 违反完整性规则时触发的过程。

5.2 完整性控制
例如,在“学号不能为空”的约束中 D 约束作用的对象为Sno属性 O 插入或修改Student元组时 A Sno不能为空 C 无(A可以作用于所有记录的Sno属性) P 拒绝执行该操作 又如,在“教授工资不得低于1000元”的约束中 D 约束作用的对象为工资Sal属性 O 插入或修改职工元组时 A Sal不能少于1000 C 职称=“教授”(A仅作用于职称=“教授”的记录) P 拒绝执行该操作
5.1 完整性约束条件 二、静态元组约束 一个元组是由若干个列值组成的,静态元组约 束就是规定元组的各个列之间的约束关系。 例如订货关系中包含发货量、订货量等列,规 定发货量不得超过订货量; 又如教师关系中包含职称、工资等列,规定教 授的工资不低于1000元。
5.1 完整性约束条件 三、静态关系约束 在一个关系的各个元组之间或者若干关系之间 常常存在各种联系或约束。常见的静态关系约 束有:
5.2 完整性控制 4. 修改关系中主码的问题

不允许修改主码
在有些RDBMS中,修改关系主码操作是不允许 的,例如不能用UPDATE语句将学号95001改为 95102。如果需要修改主码值,只能先删除该元 组,然后再把具有新主码的元组插入到关系中。
5.2 完整性控制

允许修改主码 在有些RDBMS中,允许修改关系主码,但必须 保证主码的唯一性和非空,否则拒绝修改。 当修改的关系是被参照关系时,还必须检查参 照关系,是否存在这样的元组,其外码值等于 被参照关系要修改的主码值。 例如要将Student关系中Sno=950001的Sno值改 为960123,而SC关系中有4个元组的Sno=950001, 这时与在被参照关系中删除元组的情况类似, 可以有:级联修改、拒绝修改、置空值修改三 种策略加以选择。
5.1 完整性约束条件 一、静态列级约束 3. 对取值范围或取值集合的约束 例如,规定学 生成绩的取值范围为0-10Βιβλιοθήκη Baidu,性别的取值集合 为[男,女]。 4. 对空值的约束 空值表示未定义或未知的值, 它与零值和空格不同。有的列允许有空值,有 的则不允许。例如学生学号不能取空值,成绩 可以为空值。 5. 其它约束 例如关于列的排序,组合列等。
5.2 完整性控制
1. 外码能否接受空值问题
例如,职工-部门数据库包含职工表EMP和部门表
DEPT,其中DEPT关系的主码为部门号Deptno,
EMP关系的主码为职工号Empno,外码为部门号 Deptno,称DEPT为被参照关系或目标关系,EMP
为参照关系。
EMP中,某一元组的Deptno列若为空值,表示这个
5 数据库完整性

完整性约束条件


完整性控制
FoxPro的完整性

小结
5 数据库完整性
数据库的完整性是指数据的正确性和相容性。
例如,学生的学号必须唯一;
性别只能是男或女、本科学生的年龄的取值范 围为14-30的整数; 学生所在的系必须是学校已经开设的系等。 数据库是否具备完整性关系到数据库系统能否 真实地反映现实世界,因此维护数据库的完整 性是非常重要的。

5.1 完整性约束条件
四、动态列级约束 动态列级约束是修改列定义或列值时应满足的约束条
件,包括下面两方面:

修改列定义时的约束 例如,将允许空值修改成不允许空值时,如果该列目 前已存在空值,则拒绝这种修改。 修改列值时的约束

修改列值有时需要参照其旧值,并且新旧值之间需要 满足某种约束条件。例如,职工工资调整不得低于其 原来的工资,学生年龄只能增长等。
5.2 完整性控制 3. 在参照关系中插入元组时的问题 例如向SC关系插入(99001,1,90)元组,
而Student关系中尚没有Sno=99001的学生,一
般地,当参照关系插入某个元组,而被参照关 系不存在相应的元组,其主码值与参照关系插 入元组的外码值相同,这时可以有以下策略:
5.2 完整性控制
职工尚未分配到任何部门工作。这和应用环境的语
义是相符的,因此EMP的Deptno列可以取空值。
5.2 完整性控制
1. 外码能否接受空值问题
但在学生-选课数据库中,Student关系为被参照 关系,其主码为Sno。SC为参照关系,外码为Sno。 若SC的Sno为空值,则表示尚不存在的某个学生, 或者某个不知学号的学生,选修了某门课程,其成 绩记录在Grade列中。这与学校的应用环境是不相 符的,因此SC的Sno列不能取空值。 因此在实现参照完整性时,系统除了应该提供定义 外码的机制,还应该提供定义外码列是否允许空值 的机制。

实体完整性约束 参照完整性约束 实体完整性约束和参照完整性约束是关系模型 的两个极其重要的约束,称为关系的两个不变 性。
5.1 完整性约束条件 三、静态关系约束

函数依赖约束。大部分函数依赖约束都在关系 模式中定义。 统计约束。即字段值与关系中多个元组的统计 值之间的约束关系。 例如规定部门经理的工资不得高于本部门职工 平均工资的5倍,不得低于本部门职工平均工 资的2倍。
5.2 完整性控制
一条完整性规则可以用一个五元组(D,O,A,C,P) 来表示,其中:

D(Data) 约束作用的数据对象; O(Operation) 触发完整性检查的数据库操作,即当 用户发出什么操作请求时需要检查该完整性规则,是 立即检查还是延迟检查;

A(Assertion) 数据对象必须满足的断言或语义约束, 这是规则的主体;
5.2 数据库完整性
数据的完整性和安全性是两个不同的概念。
前者是为了防止数据库中存在不符合语义的数 据,防止错误信息的输入和输出,即所谓垃圾 进垃圾出(Garbage In Garbage Out)所造成 的无效操作和错误结果。
而后者是保护数据库防止恶意破坏和非法的存 取。也就是说,安全性措施的防范对象是非法 用户和非法操作,完整性措施的防范对象是不 合语义的数据。
5.2 完整性控制 2. 在被参照关系中删除元组的问题 例如要删除Student关系中Sno=95001的元组, 而SC关系中又有4个元组的Sno都等于95001, 一般地,当删除被参照关系的某个元组,而参 照关系存在的若干元组,其外码值与被删除元 组的主码值相同,这时可有三种不同策略:
5.2 完整性控制

受限插入
仅当被参照关系中存在相应的元组,其主码值与参照 关系插入元组的外码值相同时,系统才执行插入操作, 否则拒绝此操作。例如对于上面的情况,系统将拒绝 向SC关系插入(99001,1,90)元组。

递归插入
首先向被参照关系中插入相应的元组,其主码值等于 参照关系插入元组的外码值,然后向参照关系插入元 组。例如对于上面的情况,系统将首先向Student关系 插入Sno=99001的元组,然后向SC关系插入(99001, 1,90)元组。
5.2 完整性控制

置空值删除(NULLIFIES) 删除被参照关系的元组,并将参照关系中相应 元组的外码值置空。例如。例如将上面Sc关系 中所有Sno= 95001的元组的Sno值置为空值。 这三种处理方法,哪一种是正确的呢?这要依 应用环境的语义来定。在学生-选课数据库中, 显然第1种方法是对的。因为当一个学生毕业或 退学后,他的个人记录从Student表中删除了, 他的选课记录也应随之从SC表中删除。

元组
关系
对象粒度
图5.1完整性约束条件分类
5.1 完整性约束条件 一、静态列级约束 静态列级约束是对一个列的取值说明,这是最 常用也是最容易实现的一类完整性约束。 1. 对数据类型的约束(包括数据的类型、长度、 单位、精度等) 2. 对数据格式的约束 例如,规定学号的前两位 表示入学年份,中间两位表示系的编号,后三 位为顺序编号。
完整性约束条件作用的对象可以是关系、元组、 列三种。
其中列约束条件主要是列的类型、取值范围、精 度、排序等约束条件。 元组的约束条件是元组中各个字段间的联系的约 束。 关系的约束是若干元组间、关系集合上以及关系 之间的联系的约束。
5.1 完整性约束条件 完整性约束条件涉及的这三类对象,其状态可以 是静态的,也可以是动态的。

5.2 完整性控制
检查是否违背完整性约束的时机通常是在一条语句执 行完后立即检查,称这类约束为立即执行约束 (Immediate Constraints)。
有时完整性检查需要延迟到整个事务执行结束后再进 行,检查正确方可提交,称这类约束为延迟执行约束 (Deferred Constraints)。 例如银行数据库中“借贷总金额应平衡”的约束就应该 是延迟执行的约束。从帐号A转一笔钱到帐号B为一个 事务,从帐号A转出前后帐就不平了,必须等转入B后 帐才能重新平衡,这是才能进行完整性检查。 如果发现用户操作请求违背了完整性约束条件,系统 将拒绝该操作,但对于延迟的约束,系统将拒绝整个 事务,把数据库恢复到该事务执行前的状态。
5.1 完整性约束条件 五、动态元组约束 动态元组约束是指修改元组的值时元组中各字 段间需要满足某种约束条件。例如职工工资调 整时新工资不得低于原工资+工龄*1.5倍。 六、动态关系约束 动态关系约束是加在关系变化前后状态上的限 制条件,例如事务一致性、原子性等约束。
5.1 完整性约束条件
表5.1 完整性的约束条件 粒度 状态 静态 列级 列定义 · 类型 · 格式 · 值域 · 空值 改变列定 义或列值 元组级 元组值 应满足 的条件 关系级 实体完整性约束 参照完整性约束 函数依赖约束 统计约束
相关文档
最新文档