4.3 操作数据约束

通常在设计一张数据表的时候不仅要对表中所用字段和内容进行考虑,还有一个更加重要的问题,就是对数据完整性的设计。数据完整性是指数据的精确性和可靠性,防止表中出现不符合既定设置的数据(非法数据)。这些数据可能是用户没有根据规则输入的数据,也可能是黑客对于数据库破解所做出的一些特定尝试,确保数据的完整性对于整个数据库系统而言是非常重要的。

在SQL Server 2016中,通常会通过约束的形式来对数据表进行完整性的设置,主要的约束方式分为5种,分别是:主键约束(primary key constraint)、唯一性约束(unique constraint)、检查约束(check constraint)、默认约束(default constraint)和外键约束(foreign key constraint)。

4.3.1 用主键约束防止无效数据

主键约束指的是可以在表中定义一个字段作为表的主要关键字,主键是表中记录的唯一性标识,每个表中只允许一个PRIMARY KEY约束,并且作为PRIMARY KEY约束的字段不允许空值。若在一个表中有多个列作为主键约束,则一列中的值可以是重复的,但是被主键约束列中的组合值一定要是唯一存在的。

在SQL Server 2016中添加约束的方法主要有两种,一种是通过对象资源管理器来创建,还有一种则是使用T-SQL语句来创建。

使用对象资源管理器对学生选课数据库(xsxk)中的学生表(dbo.xs)中的学号字段进行PRIMARY KEY的设定,具体操作如下:

步骤01 在【资源管理器】中展开xsxk数据库,右击dbo.xs数据表,选择【设计】,在表设计窗口中右击【学号】字段,在弹出的快捷菜单中选择【设置主键】命令,如图4.17所示。

步骤02 主键设置完成后,学号所在字段会有一把钥匙的小图标,表示该字段为表的主键列,如图4.18所示。

图4.17 选择【设置主键】命令

图4.18 主键列【学号】

当某列设置为主键时,不允许为空,也不能有重复值。

4.3.2 用唯一性约束防止重复数据

唯一性约束(UNIQUE)可以确保数据表在主键列中字段的唯一性。保证其中的数值只出现一次,而不会出现重复的现象。例如,在员工信息表中需要录入所有员工的手机号码,然而并不可能有两位员工的手机号码是相同的,此时我们可以对手机号码字段进行唯一性约束的设置。在SQL Server 2016中可以对一个表中的多个字段进行UNIQUE约束,在使用UNIQUE时需要注意以下几点要素:

● UNIQUE约束是允许空值的。

● UNIQUE约束可以在一个数据表中设立多个。

● 使用了UNIQUE约束的字段会建立唯一性索引。

● 在默认的情况下,UNIQUE约束创建的是非聚集索引。

使用对象资源管理器对姓名字段进行UNIQUE约束操作的步骤如下:

步骤01 在【资源管理器】中展开xsxk数据库,右击dbo.xs数据表,选择【设计】命令,在表设计窗口中右击【姓名】字段,在弹出的快捷菜单中选择【索引/键】命令,如图4.19所示。

图4.19 选择【索引/键】命令

步骤02 在【索引/键】对话框中,单击【添加】按钮,添加一个唯一性约束,如图4.20所示。

图4.20 增加新索引

步骤03 选中新建的IX_xs索引,单击列边上的按钮,在弹出的下拉列表中选择【姓名】字段,如图4.21所示。

图4.21 选择【姓名】字段

步骤04 设置完成后,单击【确定】按钮完成操作。

4.3.3 检查约束

检查约束是对录入到数据表中的数据所设置的检查条件,以限制输入值,用于保证数据库的完整性。通过逻辑表达式来对字段的值进行输入内容的限定,例如在员工表中定义了一个age字段,我们需要把这个字段所录入的内容限定在一个合理及合法的范围内,比如18~70岁,可以通过逻辑表达式age>=18 AND age<=70来进行判断,逻辑表达式会返回TRUE或FALSE两个值,用来表示符合约束条件和不符合约束条件两种情况。通常在使用检查约束时,需要注意以下几点:

● 在对列进行约束限制时,只能与字段有关;在对表进行约束限定时,只能与限制表中的字段有关。

● 在数据表中可以对多个列进行检查约束的设置。

● 在使用CREATE TABLE时,只能对每个字段设置一个检查约束。

● 若在表中对多个字段进行检查约束,则为表级约束。

● 检查约束将在数据表进行INSERT和UPDATE操作时对数据进行验证。

● 设置检查约束的时候不能包含子查询。

使用对象资源管理器对学生选课数据库(xsxk)中的学生表(dbo.xs)中的性别字段进行检查约束的设定,要求只能输入“男”或“女”,具体操作步骤如下:

步骤01 在【资源管理器】中展开xsxk数据库,右击dbo.xs数据表,选择【设计】命令,在表设计窗口中右击【性别】字段,在弹出的快捷菜单中选择【检查约束】命令,如图4.22所示。

图4.22 选择【检查约束】命令

步骤02 在弹出的对话框中单击【添加】按钮,增加一条新的条件约束,如图4.23所示。

图4.23 添加新的检查约束

步骤03 选中新建的约束,在【表达式】中输入条件表达式([性别]='男' OR [性别]='女'),如图4.24所示。

图4.24 输入条件表达式

包括隐式或显式数据类型转换的约束可能会导致某些操作失败。例如,为表定义的作为分区切换的源的此类约束可能会导致ALTER TABLE…SWITCH操作失败。在约束定义中避免数据类型转换。

4.3.4 默认约束

默认约束是指当某一字段没有提供数据内容时,系统自动给该字段赋予一个设定好的值。当必须向表中加载一行数据但不知道某一字段值的值或该值不存在时,可以使用默认约束。默认约束可以使用常量、函数、空值作为默认值。使用默认约束时,需要注意以下几点:

● 每个字段只能有一个默认约束。

● 若默认约束设置的值大于字段所允许的长度,则截取到字段允许长度。

● 不能加入到带有IDENTITY属性或TIMESTAMP的字段上。

● 若字段的数据类型为用户自定义类型,而且已有默认值绑定在此数据类型上,则不允许再次使用默认值。

4.3.5 外键约束

外键约束是在两个表中的数据之间建立和加强链接的一列或多列的组合,可控制在外键表中存储的数据。在外键引用中,当包含一个表的主键值的一个或多个列被另一个表中的一个或多个列引用时,就在这两个表之间创建了链接。使用外键约束需要注意以下几点:

● 外键约束是对字段参照完整性的设置。

● 外键约束不支持自动创建索引,需要手动建立。

● 表中最多可以使用31个外键约束。

● 临时表中不能建立外键约束。

● 主键和外键的数据类型必须严格匹配。