4.1 表概述

4.1.1 表的基本结构

表是组成数据库的基本元素,是SQL Server中一个很重要的数据库对象,用于存储数据库中所有数据。数据在表中的逻辑组织方式与在电子表格中相似,都是按行和列的格式组织的。行被称为记录,是组织数据的单位;列被称为字段,每一列代表记录的一个属性。

例如,公司员工表中,每一行代表一名员工,各列分别代表该员工的信息,如员工编号、姓名、性别、部门、职务、联系电话等,如图4.1所示。

图4.1 员工表的基本结构

4.1.2 表的类型

除了基本用户定义表以外,SQL Server还提供了下列类型的表,这些表在数据库中起着特殊的作用。

1.系统表

SQL Server将定义服务器配置及其所有表的数据存储在一组特殊的表中,这组表称为系统表。用户不能直接查询或更新系统表,可以通过系统视图查看系统表中的信息。

2.临时表

临时表有两种类型:本地表和全局表。本地临时表的名称以单个数字符号(#)打头,它们仅对当前的用户连接是可见的,当用户从SQL Server实例断开连接时被删除。全局临时表的名称以两个数字符号(##)打头,创建后对任何用户都是可见的,当所有引用该表的用户从SQL Server实例断开连接时将被删除。临时表存储在tempdb中。

3.已分区表

已分区表是将数据水平划分为多个单元的表,这些单元可以分布到数据库中的多个文件组中。在维护整个集合的完整性时,使用分区可以快速而有效地访问或管理数据子集,从而使大型表或索引更易于管理。

4.宽表

宽表使用稀疏列,从而将表可以包含的总列数增大为30000列。稀疏列是对Null值采用优化的存储方式的普通列。稀疏列减少了Null值的空间需求,但代价是检索非Null值的开销增加。

4.1.3 数据类型

SQL Server中的数据类型分为两种:基本数据类型(系统数据类型)和用户定义数据类型。

1.基本数据类型

基本数据类型按照数据的表现方式和存储方式的不同可以分为精确数字、近似数字、日期和时间、字符串、Unicode字符串、二进制字符串、CLR数据类型、空间数据类型等,不同的数据结构可以为表的列指定不同的数据取值范围。常用的基本数据类型具体介绍如表4.1所示。

表4.1 基本数据类型

续表

2.用户定义数据类型

SQL Server除了基本数据类型外,还允许用户定义数据类型,用户定义数据类型是数据库开发人员建立在基本数据类型基础上的,根据自己的实际需求定义符合自己开发需要的数据类型。在SQL Server中,用户定义数据类型可以使用SSMS创建和Transact-SQL语句创建。

1)使用SSMS创建用户定义数据类型

【例4.1】在ReportServer数据库中,创建用来存储收集号码信息的mobile-number用户定义数据类型,数据类型为varchar,长度为11,允许为空。

具体操作步骤如下:

(1)在“对象资源管理器”中,连接到SQL Server数据库引擎的实例,然后展开该实例。

(2)依次展开“数据库”→“ReportServer”→“可编程性”→“类型”→“用户定义数据类型”,如图4.2所示。

(3)右击“用户定义数据类型”,在弹出的快捷菜单中选择“新建用户定义数据类型”命令,在打开的“新建用户定义数据类型”窗口中名称处输入“mobile-number”,在“数据类型”下拉列表框中选择“varchar”,在“长度”文本框中输入“11”,勾选“允许NULL值”复选框,如图4.3所示。

图4.2 “用户定义数据类型”选项

图4.3 “新建用户定义数据类型”窗口

(4)单击“确定”按钮,完成“mobile-number”用户定义数据类型的创建。

2)使用Transact-SQL创建用户定义数据类型

创建用户定义数据类型的Transact-SQL语句是CREATE TYPE语句,其基本语法如下:

CREATE TYPE语句的参数及说明如表4.2所示。

表4.2 CREATE TYPE语句的参数及说明

【例4.2】在ReportServer数据库中,创建用来存储邮政编码信息的postcode用户定义数据类型,数据类型为varchar,长度为6,允许为空。

具体操作步骤如下:

在SSMS中,单击工具栏中的“新建查询”按钮,打开“查询设计器”,输入如下代码,输入完成后,单击工具栏中的“执行”按钮,执行该段代码完成postcode数据类型的创建。

4.1.4 表的完整性规则

SQL Server数据库提供了三种数据完整性规则:实体完整性规则、参照完整性规则和用户自定义的完整性规则。

(1)实体完整性要求每一个表中的主键字段都不能为空或者重复的值。实体完整性指表中行的完整性,要求表中的所有行都有唯一的标识符,称为主关键字。

(2)参照完整性要求参照的关系表中的属性值必须能够在被参照关系表找到或者取空值。可以在被参照表进行更新、插入或删除记录时,自动在参照表中执行对应的操作。通常,在客观现实中的实体之间存在一定联系,在关系模型中实体及实体间的联系都是以关系进行描述,因此操作时就可能存在着关系与关系间的关联和引用。

(3)用户定义完整性是对数据表中字段属性的约束,包括字段的值域、字段的类型和字段的有效规则(如小数位数)等约束,是由确定关系结构时所定义的字段的属性决定的。例如,百分制成绩的取值范围在0~100之间。

4.1.5 表的约束

约束定义了必须遵循的用户维护数据一致性和正确性的规则,是实现数据完整性的重要手段,在SQL Server 2012中的约束主要有主键约束(PRIMARY KEY constraint)、唯一性约束(UNIQUE constraint)、检查约束(CHECK constraint)、默认约束(DEFAULT constraint)、外键约束(FOREIGN KEY constraint)。

1.主键约束

表通常具有包含唯一标识表中每一行的值的一列或一组列。这样的一列或多列称为表的主键(PK),用于强制表的实体完整性。使用主键约束时,应注意以下事项:

(1)一个表只能包含一个主键约束。

(2)主键不能超过16列,且总密钥长度不能超过900个字节。

(3)在主键约束中定义的所有列都必须定义为不为Null。

2.唯一性约束

唯一性约束可以确保在非主键字段中不输入重复的值,用于指定一个或多个列的组合值具有唯一性。使用唯一性约束时,应注意以下事项:

(1)使用唯一性约束的字段允许为空值。

(2)一个表中可以允许设置多个唯一性约束。

(3)可以把唯一性约束定义在多个字段上。

3.检查约束

检查约束对输入列或者整个表中的值设置检查条件,以限制输入值,保证数据库数据的完整性。使用检查约束时,应注意以下事项:

(1)一个表可以定义多个检查约束。

(2)每个CREATE TABLE语句中每个字段只能定义一个检查约束。

(3)在多个字段上定义检查约束,则必须将检查约束定义为表级约束。

(4)当执行INSERT语句或者UPDATE语句时,检查约束将验证数据。

(5)检查约束中不能包含子查询。

4.默认约束

默认约束指定在插入操作中如果没有提供输入值时,则系统自动指定插入值。使用默认值约束时,应注意以下事项:

(1)每个字段只能定义一个默认约束。

(2)如果定义的默认值大于其对应字段的允许长度,则输入的默认值将被截断。

5.外键约束

外键约束主要用来维护两个表之间数据的一致性,实现数据表之间的参照完整性。外键是用于在两个表中的数据之间建立和加强连接的一列或多列的组合,可控制可在外键表中存储的数据。在外键引用中,当一个表的列被引用作为另一个表的主键值的列时,就在两表之间创建了连接。这个列就成为第二个表的外键。使用外键约束时,应注意以下事项:

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

(2)一个表中最多可以有31个外键约束。

(3)在临时表中,不能使用外键约束。