SQL Server数据库应用基础(第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 与表相关的几个概念

2.2.1 主关键字、候选关键字和外键

1.主关键字(Primary Key)与候选关键字(Alternate Key)

现实世界中的实体不是孤立存在的,实体与实体之间存在关联关系,可分为一对一、一对多和多对多,对应的表与表之间也存在相同的关联关系。表与表之间的关联关系可通过定义表的主关键字(简称主键)和外键来实现。

主键是表中能够唯一区分一个记录的属性。在如图2.1所示的学生基本情况表中,学号一列可以唯一区分(或标识)不同的学生,因此可以把该列设置为主关键字,不能再输入重复的学号。

一个表只能有一个主键,主键可确保表中的每一行是唯一的,但一个表中可以没有主键,一般情况下一个表应设置一个主键。

一个表中可能有多个列都可唯一标识一条记录,我们把唯一标识一条记录的列称为候选键(简称键),如学生基本情况表中的身份证号也可唯一标识一条记录,因此身份证号与学号就是候选键。学生基本情况表反映的是学生信息,所以把学号作为主键,而把身份证号作为候选键。

图2.1 学生基本情况表

注意点:主键不一定是一列,可能是多个列组合起来才能唯一标识记录,称为组合键,如图2.2所示的学生成绩表中,学号与课程号组合才能唯一标识学生某门课程的成绩。

图2.2 组合键作为主键

2.外键(Foreign Key)

从图2.2中可以看出学生的考试成绩是存放在学生成绩表中的,在学生成绩表中是用学号和课程号来确定一个学生的考试成绩的,这就要求我们在输入学生成绩时,如果一个学生的学号在学生基本情况表中不存在,或者说学校中根本就没有这个学生,则不能给出其考试成绩。

基于这种情况,就应当建立一种“引用”的关系,确保学生成绩表中的学号在学生基本情况表中必须存在,避免出现输入错误。

外键的定义是这样的,假设存在两个表即A和B,表A中的主键在表B中存在,但并不是表B的主键,仅作为表B的一个属性列,则称此属性为表B的外键。

在图2.1与图2.2中,学生基本情况表中的“学号”是主键,学生成绩表中的“学号”不是主键,学生成绩表中“学号”的取值为学生基本情况表中“学号”的取值,我们称“学号”为学生成绩表的外键,这两个表是通过“学号”建立关联关系的。

2.2.2 数据完整性

我们已经知道了数据完整性的概念,数据完整性是指数据的准确性和有效性。数据完整性的标准解释为“存储在数据库中的所有数据值均是正确的,如果数据库中存储有不正确的数据值,则称该数据库已丧失数据完整性。”数据完整性是通过数据库表的设计和约束来实现的。

例如,在存储学生基本情况信息的表中,如果允许任意输入学生的基本信息而不加以限制,则在同一张表中可能重复出现一个学生的信息;如果不对表中存储的性别信息加以限制,则学生的性别可能出现不只是“男”或“女”两种情形;如果不对学生成绩表的成绩加以限制,则学生的成绩可能出现负数,这样的数据不具备完整性。

为了实现数据的完整性,数据库需要做如下两方面的工作:

(1)对表中行的数据进行检验,看它是否符合实际要求。

(2)对表中列的数据进行检验,看它是否符合实际要求。

为了实现以上要求,SQL Server 2008提供了以下4种约束。

1.实体完整性约束

实体完整性约束的对象是表中的行,将行定义为表中的唯一实体,即表中不存在两条完全相同的记录。例如,学生基本情况表中的学号“31022001”就只能有一条记录。实体完整性通过为表定义“主键”、“唯一性约束”或“唯一性索引”等来实现。

2.域完整性约束

域完整性约束的对象是表中的列,指特定列取值的有效范围。例如,学生基本情况表中的学生性别必须是“男”或“女”,默认值为“男”;学生成绩表中的成绩必须大于等于0且小于等于100;学生奖惩表中的奖惩类型必须是“奖励”或“处分”两种情形。域完整性可以通过为列声明数据类型,为列定义默认值、规则和约束来实现。

3.引用(或外键)完整性约束

引用完整性约束的对象是表与表之间的关系。以主键与外键之间的关系为基础,引用完整性确保键值在所有表中一致,要求不引用不存在的值,如果一个键值发生更改,则整个数据库中,对该键值的所有引用要进行一致的更改。

例如,在学生基本情况表和学生成绩表中,输入学生成绩表的学号时必须验证学生基本情况表中是否有此学生的学号;在学生基本情况表中删除一个学生的信息时,则应删除学生成绩表中相应成绩的信息,如图2.3所示。

从图2.3可以看出两张表的关联关系,学生基本情况表是含主键的表,称为“主表”,学生成绩表是含外键的表,称为“从表”(或“子表”)。

在执行引用完整性时,SQL Server禁止用户进行如下操作:

(1)当主表中没有关联的记录时,将记录添加到子表中,也就是说,学生成绩表中不能出现在学生基本情况表中不存在的学号。

(2)更改主表中的值并导致子表中的记录孤立,如果学生基本情况表中的学号改变了,则学生成绩表中的学号也会随之改变。

(3)从主表中删除记录,但仍存在与该项匹配的相关记录,把学生基本情况表中的学号删除后,该学号不能出现在学生成绩表中。

图2.3 学生成绩管理

4.用户自定义完整性约束

SQL Server允许数据库使用者根据应用处理的需求编写规则、默认、约束、存储过程、触发器等保证数据的完整性。规则、默认、存储过程、触发器将在后续章节中讲到。

例如,当我们对学生基本情况表增加或删除一个学生记录时,则在班级表中的班级学生人数应加1或减1,这可以用触发器来实现。

注意点:

· 实现完整性方法。SQL Server提供了8种常用的方式保证数据完整性,如表2.1所示。

表2.1 数据完整性的分类与实现方式的对应关系

· 常用约束与数据完整性的对应关系如表2.2所示。

表2.2 常用约束与数据完整性的对应关系