参照完整性 :关系模型的完整约束之一

更新时间:2024-09-20 22:29

参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。参照完整性又称引用完整性。

概念介绍

参照完整性是关系模型的完整约束之一,属于数据完整性的一种,其余还有:实体完整性、用户自定义完整性。

参照完整性规则:若属性或属性组F是基本关系R的外键,它与基本关系S的主键K相对应(基本关系R和S不一定是不同的关系),则对于R中的每个元组在F上的值必须为:

(1)空值,F的每个属性值均为空值。

(2)S中某个元组中的主键值(主码值)。

即参照的关系中的属性值必须能够在被参照关系找到或者取空值,否则不符合数据库的语义。在实际操作时如更新、删除、插入一个表中的数据,通过参照引用相互关联的另一个表中的数据,来检查对表的数据操作是否正确,不正确则拒绝操作。

引用关系

同一关系

在参照完整性规则中,R和S可以是同一个关系。

在学生(学号,姓名,性别,年龄,专业号,班长)关系中,“学号”属性是主键,“班长”属性表示该学生所在班级的班长的学号,因此它应用的本关系“学号”属性。按照参照完整性规则,“班长”属性可以取以下两类值:

(1)空值,表示该学生所在班级尚未选出班长。

(2)非空值,该值必须是本关系中某个元组的学号值,即某个当选班长的学生的学号值。

两个关系

如学生实体和专业实体可以用下列关系模式来表示,其中学号是学生的主键,专业号是专业的主键:

学生(学号,姓名,性别,专业号,年龄)

专业(专业号,专业名)

这两个关系之间存在着属性的引用(含有相同的属性“专业号”),学生关系引用了专业关系的主键“专业号”,专业号则是学生关系的外键。而且按照参照完整性规则,学生关系(并非专业关系)中的每个元组的“专业号”属性只能取两种值:

(1)空值,表示尚未给学生分配专业。

(2)非空值,这时该值必须是专业关系中某个元组的“专业号”值,表示该学生不可能分配到一个不存在的专业中去。就是说学生关系中的某个属性的取值需要参照专业关系的属性取值。

多个关系

两个以上的关系也可以存在引用关系,学生、课程、选课(学生与课程)之间的联系可以用下列三个关系来表示:

学生(学号,姓名,性别,专业号,年龄)

专业(专业号,专业名)

选课(学号,课程号,成绩)

这里的“学号”和“课程号”属性都是选课关系的外键,但只有“学号”和“课程号”联合起来才能确定选课的关系,所以这里存在一个复合主键关系,(学号,课程号)是选课关系的主键。虽然按照参照完整性可以取两类值,但是由于实体完整性,复合主键中的每个属性均不能取空值。所以选课关系中的”学号“和”课程号”属性实际上只能取被参照关系(学生关系和专业关系)中已经存在的主键值。即选课关系中的“学号”值必须是确实存在的学生的学号,学生关系中有该学生的记录;选课关系中的“课程号”值也必须是确定存在的课程的课程号,即课程关系中有该课程的记录。

表间规则

参照完整性属于表间规则。对于永久关系的相关表,在更新、插入或删除记录时,如果只改其一不改其二,就会影响数据的完整性:例如修改父表中关键字值后,子表关键字值未做相应改变;删除父表的某记录后,子表的相应记录未删除,致使这些记录成为孤立记录;对于子表插入的记录,父表中没有相应关键字值的记录;等等。对于这些设计表间数据的完整性,统称为参照完整性。

参照完整性则是相关联的两个表之间的约束,具体的说,就是从表中每条记录外键的值必须是主表中存在的,因此,如果在两个表之间建立了关联关系,则对一个关系进行的操作要影响到另一个表中的记录。

如果实施了参照完整性,那么当主表中没有相关记录时,就不能将记录添加到相关表中。也不能在相关表中存在匹配的记录时删除主表中的记录,更不能在相关表中有相关记录时,更改主表中的主键值。也就是说,实施了参照完整性后,对表中主键字段进行操作时系统会自动地检查主键字段,看看该字段是否被添加、修改、删除了。如果对主键的修改违背了参照完整性的要求,那么系统就会自动强制执行参照完整性。

实践应用

例如,如果在学生表和选修课之间用学号建立关联,学生表是主表,选修课是从表,那么,在向从表中输入一条新记录时,系统要检查新记录的学号是否在主表中已存在,如果存在,则允许执行输入操作,否则拒绝输入,这就是参照完整性。

参照完整性还体现在对主表中的删除和更新操作,例如,如果删除主表中的一条记录,则从表中凡是外键的值与主表的主键值相同的记录也会被同时删除,将此称为级联删除;如果修改主表中主关键字的值,则从表中相应记录的外键值也随之被修改,将此称为级联更新。

学生表(主表)

选修课表(从表)

参照完整性的体现:不可以在表二中插入“200103”数据,因为值“200103”在主表中不存在加入“200103”数据破坏了完整性的原则,也就是破坏了多表间(A表主码=B表外码)的一致性。不同的表相同的列名的数据保持不变,不能单独增加,就算要增加(或删除)也要同时增加(或删除)。

参考资料

免责声明
隐私政策
用户协议
目录 22
0{{catalogNumber[index]}}. {{item.title}}
{{item.title}}
友情链接: