购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.4 数据完整性

数据完整性是指数据的正确性和相容性。例如,每个人的身份证号都是唯一的,人的性别只能是“男”或“女”,人的年龄应该在0~150岁之间(假设人现在最多能活到150岁)的数字,学生所在的系必须是学校已有的系等。

数据完整性约束是为了防止数据库中存在不符合语义的数据,为了维护数据的完整性,数据库管理系统必须提供一种机制来检查数据库中的数据,看其是否满足语义规定的条件。这些加在数据库数据之上的语义约束条件就是数据完整性约束,这些约束条件作为表定义的一部分存储在数据库中。而DBMS检查数据是否满足完整性约束条件的机制就称为完整性检查。

3.4.1 完整性约束条件的作用对象

完整性检查是围绕完整性约束条件进行的,因此,完整性约束条件是完整性控制机制的核心。完整性约束条件的作用对象可以是表、元组和列。

1.列级约束

列级约束主要指对列的类型、取值范围、精度等的约束,具体包括如下内容。

●对数据类型的约束:包括数据类型、长度、精度等。例如,学生学号的数据类型为普通编码定长字符型,长度为7。

●对数据格式的约束:如规定学号的前两位表示学生的入学年份,第3位表示系的编号,第4位表示专业编号,第5位表示班的编号等。

●对取值范围或取值集合的约束:如学生的成绩取值范围为0~100,最低工资要大于1600等。

●对空值的约束:有些列允许有空值(比如成绩),有些列则不允许有空值(比如姓名),在定义列时应指明其是否允许取空值。

2.元组约束

元组约束指元组中各个字段之间的相互约束,如某学生的入学日期必须早于其毕业日期,某工作的最低工资应小于其最高工资。

3.关系约束

关系约束指若干元组之间、关系之间的联系的约束。比如,学号的取值不能重复也不能取空值,学生修课表中“学号”的取值受学生表中“学号”取值的约束等。

3.4.2 实现数据完整性

实现数据完整性一般是在服务器端完成的。在服务器端实现数据完整性的方法主要有两种,一种是在定义表时声明数据完整性,另一种是在服务器端编写触发器来实现数据完整性(本书只介绍在定义表时声明完整性的方法)。不管采用哪种方法,只要用户定义好了数据完整性,后续执行对数据的增加、删除、修改操作时,数据库管理系统都会自动检查用户定义的完整性约束,只有符合约束条件的操作才会被执行。

这里介绍如何使用SQL语句实现实体完整性(PRIMARY KEY)、引用完整性(FOREIGN KEY)和用户定义的完整性。在用户定义的完整性中我们介绍默认值(DEFAULT)约束、列值取值范围(CHECK)约束和唯一值(UNIQUE)约束的实现方法。

下面以雇员表和工作表为例,逐步在这两张表上添加约束。

雇员表结构如下。

雇员编号:普通编码定长字符型,长度为7,非空;

雇员名:普通编码定长字符型,长度为10;

工作编号:普通编码定长字符型,长度为8;

工资:整型;

电话号码:普通编码定长字符型,长度为11,非空。

工作表结构如下。

工作编号:普通编码定长字符型,长度为8,非空;

最低工资:整型;

最高工资:整型。

其中,“雇员编号”是雇员表的主键,“工作编号”是工作表的主键,而且雇员表中的“工作编号”是引用工作表中的“工作编号”的外键。

假设我们已经按上述要求创建好了这两张表,现在要为这两张表添加需要的约束。

1.主键(PRIMARY KEY)约束

添加主键约束要注意如下问题:

●每个表只能有一个主键约束。

●用主键约束的列取值不能有重复,而且不允许有空值。

添加主键约束的ALTER TABLE语句语法格式如下:

【例6】 对雇员表和工作表分别添加主键约束。

2.唯一值(UNIQUE)约束

唯一值约束用于限制在一个列中不能有重复的值。这个约束用在事实上具有唯一性的属性列上,比如每个人的身份证号码、驾驶证号码等均不能有重复值。定义唯一值约束时需要注意如下事项:

●唯一值约束的列允许有一个空值。

●在一个表中可以定义多个唯一值约束。

●可以在多个列上定义一个唯一值约束,表示这些列组合起来不能有重复值。

当一个表中存在多个不允许有重复值的属性时,唯一值约束就非常有用,比如雇员表中,雇员编号和电话号码都不允许取值重复(假设雇员的电话号码不能重复),已经在雇员编号上定义了主键约束,因此可以保证雇员编号取值不重复。这时电话号码取值不重复就必须使用唯一值约束来保证了。

添加唯一值约束的语法格式如下:

【例7】 为雇员表的“电话号码”列添加唯一值约束。

3.外键(FOREIGN KEY)约束

外键约束实现了引用完整性,添加外键约束时要注意:外键所引用的列必须是有主键约束或唯一值约束定义的列。

添加外键约束的语法格式如下:

【例8】 为雇员表的工作编号添加外键引用约束,此列引用工作表的工作编号列。

4.默认值(DEFAULT)约束

默认值约束用于提供列的默认值。只有在向表中插入数据时系统才检查默认值约束。

添加默认值约束的语法格式如下:

【例9】 定义雇员表的工资的默认值为3600。

5.列取值范围(CHECK)约束

列取值范围约束用于限制列的取值在指定范围内,使数据库中存储的值都是有意义的。例如,人的性别只能是“男”或“女”,工资必须大于等于1600元(假设最低工资为1600元)。使用列取值范围约束可以限制一个列的取值范围,也可以实现同一个表中多个列之间的相互取值约束,比如最低工资小于最高工资。

添加列取值范围约束的语法格式如下:

【例10】 在雇员表中,添加限制雇员的工资必须大于等于2000的约束。

【例11】 添加限制工作表的最低工资小于等于最高工资的约束。

上述这些约束都可以在定义表的同时定义,综合起来如下: o87CQy3t5JgeAC+/YVGsTAE/7U/72QQ5GQWAmfYHYp+T1zDg62hsHZwrTtAMlZOA

点击中间区域
呼出菜单
上一章
目录
下一章
×