关系数据库的完整性约束条件包括:实体完整性、参照完整性、用户自定义完整性。
其中,实体完整性和参照完整性是其必须满足的。
(1)实体完整性
实体完整性是指数据库的主键值不能为空且不能重复,避免记录无效或同一个记录被多次重复存储的窘况。
(2)参照完整性
百度百科指出,参照完整性是指关系数据库中不能引用不存在的实体,这个概念不太好理解。
其实,参照完整性应用于关联数据库,也就是说,其将不同表单的两个元组通过某种关系而关联起来。
假设,属性(或属性组)F为关系R的外键,其与关系M的主键K相对应,则参照完整性要求,F在关系R中的属性值满足以下条件之一:
a. 所有属性值为NULL;
b. 等于关系M中主键K的属性值之一。
举例说明一下:
学生表(学号,学生姓名):学号为主键;
课程表(课程号,代课教师):课程号为主键;
选课表(学号,课程号,。。。。):学号和课程号组成的属性组为主键,同时学号和课程号为选课表的外键。
每个表单中主键对应的属性值都不能为空或者重复,这属于实体完整性。
而如果学生表中,学号的数据域为1-55,那么在选课表中,为某一元组的学号的属性值设置为56,就会出错,这就属于参照完整性。
再举另外一些例子:
a. 两个关系间
如学生实体(=表单)和专业实体(=表单)具备以下关系模式,其中学号为学生实体的主键,专业号为专业实体的主键;
学生实体(学号,姓名,性别,专业号,班级)
专业实体(专业号,专业名称,代课教师)
则学生实体中的专业号为外键,那么学生实体中,专业号的属性值只能从以下条件择一:
1)全部为NULL,表示尚未给学生分配专业;
2)必须为专业实体中专业号的属性值之一,即学生关系中专业号的取值需要参照专业关系中的属性值。
b. 三个及以上关系间
如具有以下三个实体,
学生(学号,姓名,性别,年龄)
课程(课程号,代课教师)
成绩(学号,课程号,分数)
其中学号为学生实体的主键,专业号为专业实体的主键,学号和课程号的属性组合为成绩实体的主键(即复合主键);
然后,对于成绩实体,学号和课程号为外键。
理论上,成绩实体中的学号和课程号的属性取值可以参考上述二选一的规则,但是由于其又是本身实体的复合主键,
所以,其属性值必须参考学生关系和课程关系中对应的属性值,且不能有重复。
此例子是参照完整性与实体完整性的有效结合应用。
c. 一个实体的参照完整性解述
表决实体(学号,姓名,专业号,班长学号),其中学号为该表单的主键,班长学号的属性表示该学生选择的担任班长职位的学生学号。
因此,“班长学号”属性引用了自身实体中“学号”属性,按照参照完整性,“班长学号”属性值只能为以下条件之一:
1)全部为空值,表示学生全部弃权或未选出;
2)非空值,为“学号”属性值之一。
(3)用户自定义完整性
任何关系数据库都支持实体完整性和参照完整性,对于用户,这是强制执行的!
除此之外,不同的数据库及其多样化的应用环境,可能会需要一些特殊的约束条件,支持用户自定义。
用户自定义完整性反映某一具体应用所涉及的属性值必须满足的语义要求。
比如,某个属性必须取唯一值,某个属性的取值范围在1-99之间,某些属性之间必须满足某种函数关系等等。