原因:主码设置的目的是用于区分关系中的元组,以将各个元组区别开来。如果主码中的属性值可以为空,那么在关系中将存在一些不确定的元组,这些元组将不知道是否能够与别的元组有区别(因为空值被系统理解为“不知道”或“无意义”的值),这在关系模型中是不允许的。各个元组在主码上的取值不允许相等,否则就不满足实体完整性约束。
Ø 实体完整性是关系模型必须满足的完整性约束条件。
【例2.1】考虑如表2.3所示的学生关系student(学号, 姓名, 性别, 专业号)和表2.4所示的课程关系course(课程号, 课程名, 学分)。假设学生关系的主码为“学号”,课程关系的主码为“课程号”,那么学生关系的“学号”以及课程关系的“课程号”的取值就不能为空,而且取值不能重复(能唯一标识每一行),否则就不满足实体完整性。
2. 参照完整性
Ø 参照完整性与外码密切相关,这里先介绍外码的概念。
Ø 对于关系R和S,假设F是关系R的一个属性或一组属性,但F不是R的码,K是关系S的主码,且F与K相对应(或相同),则F称为R的外码(Foreign key),R和S分别称为参照关系(Referencing relation)和被参照关系(Referenced relation),如图2.1所示。
• F与K是相同的属性或属性集,它们的取值范围相同。
• 关系模型的参照完整性约束:外码F中的每个属性值等于主码K的某一个属性值或F的每个属性值均为空值。
• 如果要在关系R中插入一个元组,则该元组在属性F上的取值等于关系S中某一个元组在主码K上的取值或全置为空值,否则不能插入该元组。当关系S为空时,不能向关系R中插入元组;当要删除关系S中的一些元组时,必须先删除关系R中与这些元组相关联的元组。
• 参照完整性也是关系模式必须满足的完整性约束条件。
【例子】选课关系SC(学生编号, 课程编号, 成绩),如表2.5所示。可见属性组{学生编号,课程编号}为该关系的主码。
属性“学生编号”是选课关系的外码,它与关系“student(学号, 姓名, 性别, 专业号)”的主码“学号”相对应,选课关系为参照关系,学生关系为被参照关系,“课程编号”同理。
• 外码“学生编号”和“课程编号”共同组成了该关系的主码,这两个属性的取值不能为空,只能为相应被参照关系中相应列中的取值。
【例子】表2.5中“学生编号”列的属性值“201301”必须等于表2.3中“学号”列中的某一个属性值;表2.5中的“课程编号”列的属性值“13989”必须等于表2.4中“课程号”列中的某一个属性值。
• 表2.6所示的专业关系major(专业编号, 专业名),该关系的主码是“专业编号”,且表2.3所示关系“学生”中的“专业号”与该关系中的“专业编号”相对应,即“专业号”是学生关系student的外码。在这种情况下,由于学生关系student中的“专业号”不是该关系的主码,因而“专业号”列的属性值可以取空值。
【例子】表2.3中学生“李鑫”所对应的“专业号”为空值,这表明尚未给该学 生分配专业。