首页 百科知识 数据库的完整性

数据库的完整性

时间:2022-10-17 百科知识 版权反馈
【摘要】:数据库完整性是指数据库中的数据始终保持正确的状态,防止不符合语义规定的错误数据的输入和输出。这些加载数据库数据之上的语义约束条件称为数据库完整性约束条件,作为模式一部分存入数据字典中,DBMS检查数据是否满足完整性条件的机制就称为完整性检查。

1.4.4 数据库的完整性

数据库系统运行后,应能保证数据库中的数据是正确的。上两节介绍的数据库恢复技术和并发控制技术,保证了系统发生故障后恢复到某一正确状态以及避免由于事务的并发执行而产生错误的数据,对于新输入的数据和对原有数据更新的正确性则需要由数据库的完整性技术来保证。

数据库完整性是指数据库中的数据始终保持正确的状态,防止不符合语义规定的错误数据的输入和输出。数据库管理系统须提供一种机制来检查数据库中的数据是否满足语义规定的条件。这些加载数据库数据之上的语义约束条件称为数据库完整性约束条件,作为模式一部分存入数据字典中,DBMS检查数据是否满足完整性条件的机制就称为完整性检查。

一、完整性约束条件

完整性约束条件涉及三类作用对象,即属性级、元组级和关系级,这三类对象的状态可以是静态的,也可以是动态的。结合这两种状态,一般将这些约束条件分为下面6种类型:

■ 静态属性级约束

静态属性级约束是对属性值域的说明,即对数据类型、数据格式和取值范围的约束。如出生年月必须为YY.MM.DD,日期的取值范围必须为1~31等。

■ 静态元组级约束

静态元组级约束就是对元组中各个属性值之间关系的约束。如开始日期小于结束日期等。

■ 静态关系级约束

静态关系级约束是指元组中各个字段之间的联系的约束。常见的静态关系级约束有:实体完整性约束、参照完整性约束、函数依赖约束和统计约束。

■ 动态属性级约束

动态属性级约束是修改定义或属性值时应满足的约束条件。包括下面两方面:一是修改定义时的约束。例如将原来允许为空值的属性改为不允许为空,如果该属性当前存在空值,则拒绝这种修改。二是修改属性值约束。修改属性值有时需要参考原来值,且新值与原有值之间需要满足某种约束条件,如职工工资调整时不得低于原有工资,学生年龄只能增长等。

■ 动态元组级约束

动态元组级约束是指修改某个元组的值时要参照该元组的原有值,并且新值和原有值之间应当满足某种约束条件。如职工的工资调整时新工资不得低于原工资+工龄×1.5等。

■ 动态关系级约束

动态关系级约束是加在关系变化前后状态上的限制条件。如事务的原子性、一致性等约束条件。

上述六类数据库完整性约束条件的语义可用表1-2概括。

表1-2 完整性约束条件

img8

二、完整性控制

DBMS的完整性控制机制应具有三个方面的功能:

■ 定义功能

提供定义完整性约束条件的机制,确定违反了什么条件就需要使用规则进行检查。

■ 检查功能

检查用户发出的操作请求,看其是否违背了完整性约束条件。

■ 控制功能

监视数据操作的整个过程,如果发现有违背了完整性约束条件的情况,则及时进行处理。

三、参照完整性控制

(1)外码空值的问题

在实现参照完整性时,系统应根据具体的语义环境确定外码是否允许为空。

(2)被参照关系删除元组问题

当删除被参照关系的某个元组后,它们的外键值可能与被参照关系删除元组的主键值相同。要保持关系的参照完整性,就需要对参照表的相应元组进行处理。其处理策略有3种:级联删除、受限删除和置空值删除。

例如,在学生选课数据库中,学生表和选课表之间是被参照和参照关系。要删除被参照关系的学生表中“学号='04101'”的元组,而选课关系中又有2个元组的学号都是“04101”,因此可以按下面3种方法之一处理参照关系选课表中的数据。

① 级联删除

就是将参照关系中所有外键值与被参照关系中要删除的元组主键值相同的元组一起删除。如果参照关系同时又是另一个关系的被参照关系,则这种删除操作会继续级联下去。例如,要删除学生关系中“学号='04101'”的元组,则选课关系中2个“学号='04101'”的元组将被一起删除。

② 受限删除

就是仅当参照关系中没有任何元组的外键值与被参照关系中要删除元组的主键值相同时,系统才执行删除操作,否则拒绝删除操作。例如,要删除学生关系中“学号='04101'”的元组,就要求选课表中没有与“学号='04101'”相关的元组,否则系统将拒绝删除学生关系中“学号='04101'”的元组。

③ 置空值删除

删除被参照关系的元组,并将参照关系中相应元组的外键值置为空值。例如,要删除学生关系中“学号='04101'”的元组,系统会将选课关系中所有“学号='04101'”的元组的学号值置为空值。

这3种处理方法究竟需要选择哪一种,应根据具体的应用环境的语义来确定。

(3)在参照关系中插入元组时的问题

当向参照关系插入某个元组,而被参照表中不存在主键与参照表外键相等的元组时,为了保证系统的完整性,可使用受限插入或递归插入的两种处理策略。例如,向参照关系选课表中插入('04112',C1,95)元组,而被参照关系学生表中没有“学号='04112'”的学生,系统有如下两种解决方法:

① 受限插入

仅当被参照关系存在相应的元组,其主键值与参照关系插入元组的外键值相同时,系统才执行插入操作,否则拒绝此操作。

② 递归插入

首先在被参照关系中插入相应的元组,其主码值等于参照关系插入元组的外码值,然后向参照关系插入元组。如上述例子,系统将首先向学生关系插入“学号='04101'”的元组,然后向选课关系插入('04112',C1,95)元组。

(4)修改关系的主键问题

不允许修改主键。在有些RDBMS中,修改关系主键的操作是不允许的,例如不能用UPDATE语句将学号“04101”改为“04102”。如果需要修改主键值,只能先删除该元组,然后再把具有新主键的元组插入到关系中。

允许修改主键。在有些RDBMS中,允许修改关系主键,但必须保证主码的唯一性和非空,否则拒绝修改。

(5)修改表是被参照关系的问题

当修改被参照关系的某个元组时,如果参照关系存在若干个元组,其外键值与被参照关系修改元组的主键值相同,此时有以下3种处理策略:

级联修改。级联修改是如果要修改被参照关系中的某个元组的主键值,则参照关系中相应的外键值也作相应的修改。

拒绝修改。拒绝修改是如果参照关系中,有外键值与被参照关系中要修改的主键值相同的元组,则拒绝修改。

置空值修改。置空值修改是修改被参照关系的元组,并将参照关系中相应元组的外键值置为空。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈