关系的约束条件:
实体完整性
参照完整性
用户自定义完整性
实体完整性规则(entity integrity rule)
要求关系中元组在组成主键的属性上不能有空值。
如果出现空值,那么主键值就起不了唯一标识元组的作用,即存在不可标识的实体。
参照完整性(reference integrity rule)
如果属性集K是关系模式R1的主键,K也是关系模式R2的外键,那么在R2的关系中,K的取值只允许两种可能,或者为空值,或者等于R1关系中某个主键值。
这条规则的实质是“不允许引用不存在的实体”。
例 下面各种情况说明了参照完整性规则在关系中如何实现的。
① 在关系数据库中有下列两个关系模式:
S(S#,SNAME,AGE,SEX)
SC(S#,C#,SCORE)
这里带下划线者为主键,带波浪线者为外键。据规则要求关系SC中的S# 值应该在关系S中出现。如果关系SC中有一个元组(S7,C4,80),而学号S7却在关系S中找不到,那么我们就认为在关系SC中引用了一个不存在的学生实体,这就违反了参照完整性规则。
另外,在关系SC中S# 不仅是外键,也是主键的一部分,因此这里S# 值不允许空。
② 设工厂数据库中有两个关系模式:
DEPT(D#,DNAME)
EMP(E#,ENAME,SALARY,D# )
车间模式DEPT的属性为车间编号、车间名,职工模式EMP的属性为工号、姓名、工资、所在车间的编号。每个模式的主键与外键已标出。在EMP中,由于D# 不在主键中,因此D# 值允许空。
③ 设课程之间有先修、后继联系。模式如下:
R(C# ,CNAME,PC# )
其属性表示课程号、课程名、先修课的课程号。如果规定,每门课程的直接先修课只有一门,那么模式R的主键是C#,外键是PC#。这里参照完整性在一个模式中实现。即每门课程的直接先修课必须在关系中出现。
用户定义的完整性规则
在建立关系模式时,对属性定义了数据类型,即使这样可能还满足不了用户的需求。此时,用户可以针对具体的数据约束,设置完整性规则,由系统来检验实施,以使用统一的方法处理它们,不再由应用程序承担这项工作。例如学生的年龄定义为两位整数,范围还太大,我们可以写如下规则把年龄限制在15~30岁之间:
CHECK(AGE BETWEEN 15 AND 30)