6.2.2 完整性控制

6.2.2 完整性控制

DBMS的完整性控制机制具有以下3个方面的功能:

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

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

如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性。

一条完整性规则可以用一个五元组(D、O、A、C、P)来表示,其中:

D(Data)表示约束作用的数据对象。

O(Operation)表示触发完整性检查的数据库操作,即当用户发出什么操作请求时需要检查该完整性规则,是立即检查还是延迟检查。

A(Assertion)表示数据对象必须满足的断言或语义约束,这是规则的主体。

C(Condition)表示选择A作用的数据对象值的谓词。

P(Procedure)表示违反完整性规则时触发的过程。

在关系系统中,最重要的完整性约束是实体完整性和参照完整性,其他完整性约束条件可以归入用户定义的完整性。目前许多关系数据库管理系统都提供了定义和检查实体完整性、参照完整性和用户定义完整性的功能。对于违反实体完整性和用户定义完整性的操作,并不是简单地拒绝执行,有时要根据应用语义执行一些附加的操作,以保证数据库的正确性。

在本书2.3节中已讨论了关系系统中的实体完整性、参照完整性和用户定义的完整性的含义,下面讨论实现参照完整性要考虑的几个问题。

1)外码能否接受空值问题

例如,职工-部门数据库包含职工表Emp和部门表Dept,其中Dept关系的主码为部门编号Deptno,Emp关系的主码为职工编号Empno,外码为部门编号Deptno,称Dept为被参照关系或目标关系,Emp为参照关系。

在Emp中,某一元组的Deptno列若为空,表示这个职工尚未分配到任何具体的部门,这跟应用环境的语义相符,因此Emp的Deptno列可为空。但是在第3章中的学生-课程数据库中,Student关系为被参照关系,主码为Sno,SC为参照关系,外码为Sno。若SC的Sno为空,则表明尚不存在某个学生或某个没有学号的学生,选修了某门课程,这与实际学校的应用环境是不相符的,因此SC的Sno列不能取空值。

因此在实现参照完整性时,系统除了应该提供定义外码的机制,还应提供外码列是否允许空值的机制。

2)在被参照关系中删除元组的问题

例如,在学生-课程数据库中,要删除Student关系中“Sno=2020001”的元组,而SC关系中还有其他元组的Sno值等于2020001。一般地,当删除被参照关系的某个元组,而参照关系存在若干元组,其外码值与被参照关系删除元组的主码值相同,这时有3种不同的策略:

(1)级联删除

将参照关系中所有外码值与被参照关系中要删除元组主码值相同元组一起删除。例如将上面SC关系中所有Sno值为2020001的元组一起删除。如果参照关系同时又是另一个关系的被参照关系,则这种删除操作会继续级联下去。

(2)受限删除

仅当参照关系中没有任何元组的外码值与被参照关系中要删除元组的主码值相同时,系统才会执行删除操作,否则拒绝此删除操作。例如对于上面的情况,系统将拒绝删除Student关系中Sno值为2020001的元组。

(3)置空值删除

删除被参照关系的元组,并将参照关系中相应元组的外码值置空值。例如将上面SC关系中所有Sno值为2020001的元组的Sno字段置为空值。

实际应用中选用哪种处理方法要根据应用环境的语义来确定。例如上面的情况中,第一种方法是比较合适的,因为当一个学生毕业或退学之后,他的个人记录从Student表中删除了,他的选课记录也应随之从SC表中删除。

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

例如,在学生-课程数据库中,向SC关系中插入(2020001,1,90)元组,而Student关系中没有Sno值为2020001的学生。一般地,当参照关系插入某个元组,而被参照关系不存在相应主码值与参照关系插入元组的外码值相同的元组时,可以有如下策略:

(1)受限插入

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

(2)递归插入

首先向被参照关系插入相应的元组,其主码值等于被参照关系插入元组的外码值,然后向参照关系插入元组。例如对于上面的情况,系统将首先向Student中插入Sno值为2020001的元组,然后向SC关系中插入(2020001,1,90)。

4)修改关系中主码的问题

(1)不允许修改主码

在有些RDBMS中,修改关系主码的操作是不允许的,如果需要修改主码值,只能先删除该元组,然后再把具有新主码值的元组插入到关系中。

(2)允许修改主码

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

当修改的关系是被参照关系时,还必须检查参照关系,是否存在这样的元组,其外码值等于被参照关系要修改的主码值。例如,在学生-课程数据库中,要将Student关系中“Sno=2020001”的Sno值改为2021001,而SC关系中有4个元组的Sno值为2020001,这时与在被参照关系中删除元组的情况类似,可以有:级联修改、拒绝修改、置空值修改3种策略。

当修改的关系是参照关系时,还必须检查被参照关系,是否存在这样的元组,其主码值等于被参照关系要修改的外码值。例如,在学生-课程数据库中,要把SC关系中(2020001,1,90)元组修改为(2021001,1,90),而Student关系中尚没有Sno值为2021001的学生,这时与在参照关系中插入元组的情况类似,可以有受限修改和递归修改两种策略加以选择。

因此,DBMS在实现参照完整性时,除了要提供定义主码、外码机制外,还要提供不同的策略供用户选择,具体选择哪种策略,要根据实际应用环境的要求确定。