第五章 表的使用和管理
DESCRIPTION
第五章 表的使用和管理. 本章主题. 表的定义 能存储的不同数据类型 如何存储表以及将表存储于何处 使用 SSMS 和查询编辑器创建表 表的创建中所包含的更高级的部分 图片和大型文本数据. 表的使用和管理. 数据库是表的集合,表中含有数据和一些其他的一些对象,表是用来存储数据的对象。用户可以通过多种方式访问数据库中的数据,但是归根到底是访问表中的数据。所以掌握 SQL Server 的表的管理和使用是非常重要的。本章将讲解 SQL Server 2005 表的管理和使用,主要包括: 表的基本概念。 使用 Management Studio 创建、修改和删除表。 - PowerPoint PPT PresentationTRANSCRIPT
第五章表的使用和管理
1
本章主题
表的定义 能存储的不同数据类型 如何存储表以及将表存储于何处 使用 SSMS和查询编辑器创建表 表的创建中所包含的更高级的部分 图片和大型文本数据
表的使用和管理
数据库是表的集合,表中含有数据和一些其他的一些对象,表是用来存储数据的对象。用户可以通过多种方式访问数据库中的数据,但是归根到底是访问表中的数据。所以掌握 SQL Server 的表的管理和使用是非常重要的。本章将讲解 SQL Server 2005 表的管理和使用,主要包括:
表的基本概念。 使用 Management Studio 创建、修改和删除表。 使用 T-SQL 创建、修改和删除表。 实现 SQL Server 2005 的数据完整性。
通过本章学习,读者可以掌握数据库中表的基本知识和对表的基本操作。
3
第一节 表的基本概念
表
系统表简介数据类型
字符数据类型
数字数据类型日期和时
间类型
其他数据类型
4
( 一 ) 表
5
表是数据库中存储的数据库对象。表定义是一个列集合。数据在表中的组织方式与在电子表格中相似,都是按行和列的格式组织的。每一行代表一条唯一的记录,每一列代表记录中的一个字段。例如,在包含班级数据的表中,每一行代表一个班级,各列分别代表该班级的信息,如班级编号、班级名称、所属院系代码、班主任ID 等。 在 SQL Server 2005 中,每个数据库最多可包含 20 亿个表,每个表可包含 1,024 列。表的行数及总大小仅受可用存储空间的限制。每行最多包括 8,060 个字节。SQL Server 2005 中的表包括下列主要组件:
列:每一列代表由表建模的对象的某个属性,例如,一个部件表有 ID 列、颜色列和重量列。
行:每一行代表由表建模的对象的一个单独的实例。例如,公司运送的每个部件在部件表中均占一行。 如图 5.1 所示,是本书案例数据库 Student中 Classes (班级)表的内容。
图 5.1 Classes 表
( 二 ) 系统表简介
6
系统表用来保存一些服务器配置信息数据,和系统数据库一样,用户不能直接查看和修改系统表,这些表在什么地方呢? SQL Server 2005中的系统数据现在存储在隐藏的“资源”表中,这个表只能被服务器自身直接访问。
SQL Server 2005 中有很多自带的系统表,这些表都有各自的作用,表 5-1 分别描述了系统表的所属及其作用。
表名 位置 作用 表名 位置 作用sysaltfiles 主数据库 保存数据库的文件 syscolumns 每个数据库 列
syscharsets 主数据库 字符集与排序顺序 sysconstrains 每个数据库 限制sysconfigures 主数据库 配置选项 sysfilegroups 每个数据库 文件组syscurconfigs 主数据库 当前配置选项 sysfiles 每个数据库 文件sysdatabases 主数据库 服务器中的数据库 sysforeignkey
s 每个数据库 外部关键字
syslanguages 主数据库 语言 sysindexs 每个数据库 索引syslogins 主数据库 登陆帐号信息 sysmenbers 每个数据库 角色成员
sysoledbusers 主数据库 链接服务器登陆信息 sysobjects 每个数据库 所有数据库对象sysprocesses 主数据库 进程 syspermission
s 每个数据库 权限
sysremotelogins
主数据库 远程登录帐号 systypes 每个数据库 用户定义数据类型
sysusers 每个数据库 用户
表 5-1 系统表的所属及其作用
( 三 ) 数据类型
7
在 SQL Server 2005 中,每个列、局部变量、表达式和参数都具有一个相关的数据类型。数据类型是一种属性,用于指定对象可保存的数据的类型:整数数据、字符数据、货币数据、日期和时间数据、二进制字符串等。 SQL Server 提供系统数据类型集,该类型集定义了可与 SQL Server 一起使用的所有数据类型。用户还可以使用 Transact-SQL 或 Microsoft .NET Framework 定义自己的数据类型。 SQL Server 中,有个重要的数据类型空值( NULL ),此数据类型表示可以给该变量赋值,但是目前还没有赋值。 0 是一个具体的数值,它被分配了内存空间。空格代表一个字符串。可以参看图 5.1 ,图中的 NULL值表示可以输入值,但是现在还没有值。 SQL Server 2005 中的数据类型归纳为下列类别:日期和时间、其他数据类型、字符串、二进制字符串、精确数字、 Unicode 字符串、近似数字。 在 SQL Server 2005 中,根据其存储特征,某些数据类型被指定为属于下列各组:
大值数据类型: varchar(max)、 nvarchar(max) 和 varbinary(max) 大型对象数据类型:
text、 ntext、 image、 varchar(max)、 nvarchar(max)、 varbinary(max) 和 xml 。
( 四 ) 字符数据类型
8
字符数据类型包括 char, varchar和 text 。字符数据是由任何字母、符号和数字任意组合而成的数据。
字符数据类型包含固定长度或可变长度的字符数据类型。 char [ ( n ) ] :固定长度,非 Unicode 字符数据,长度为n个字
节。 n的取值范围为 1 至 8,000 ,存储大小是 n个字节。 varchar [ ( n | max ) ] :可变长度,非 Unicode 字符数据。 n的取值范围为 1 至 8,000。max 指示最大存储大小是 2^31-1 个字节。存储大小是输入数据的实际长度加 2 个字节。所输入数据的长度可以为 0 个字符。
text 类型是在服务器代码页中长度可变的非 Unicode 数据,最大长度为 2^31-1 (2,147,483,647) 个字符。当服务器代码页使用双字节字符时,存储仍是 2,147,483,647 字节。根据字符串,存储大小可能小于2,147,483,647 字节。
unicode 数据类型包括 nchar, nvarchar和 ntext 。
字符数据类型
9
下面将 unicode 字符串类型放在一起和字符串类型进行一个比较:
在 SQL Server 中,传统的非 unicode 数据类型允许使用由特定字符集定义的字符。在 SQL Server安装过程中,允许选择一种字符集。使用 unicode 数据类型,列中可以存储任何由 unicode标准定义的字符。在 unicode标准中,包括了以各种字符集定义的全部字符。使用 unicode 数据类型,所占用的空间是使用非 unicode 数据类型所占用的空间大小的两倍。 例如大写字母A 在 char或者 varchar 数据类型的字段中,占用一个字节的存储空间,但是在 nchar或者 nvarchar 数据类型的字段中占用两个字节;汉字“国”在这些数据类型的字段中都占用 2 个字节的存储空间。 在 SQL Server 中, unicode 数据以 nchar、 nvarchar 和 ntext 数据类型存储。使用这种字符类型存储的列可以存储多个字符集中的字符。当列的长度变化时,应该使用 nvarchar 字符类型,这时最多可以存储 4000 个字符。当列的长度固定不变时,应该使用 nchar 字符类型,同样,这时最多可以存储4000 个字符。当使用 ntext 数据类型时,该列可以存储多于 4000 个字符。
( 五 ) 数字数据类型
10
数字数据只包含数字。数字数据类型包括正数和负数、小数(浮点数)和整数。整数由正整数和负整数组成,例如 39、 25、 -2 和 33967 。在 SQL Server 中,整数存储的数据类型是 int, smallint和 tinyint 。 int 数据类型存储数据的范围大于 smallint 数据类型存储数据的范围。使用 int 数据类型存储数据的范围是从 -2 147 483 648 到 2 147 483 647 (每一个值要求 4 个字节存储空间)。 smallint 数据类型存储数据的范围大于 tinyint 数据类型存储数据的范围。使用 smallint 数据类型时,存储数据的范围从 -32 768 到 32 767 (每一个值要求 2个字节存储空间)。 使用 tinyint 数据类型时,存储数据的范围是从 0 到 255 (每一个值要求 1 个字节存储空间)。 精确数据类型在 SQL Server 中的数据类型是 decimal 和 numeric 。这种数据所占的存储空间根据该数据的位数后的位数来确定。 在 SQL Server 中,近似小数数据的数据类型是 float 和 real 。例如,三分之一这个分数记作, 3333333 ,当使用近似数据类型时能准确表示。因此,从系统中检索到的数据可能与存储在该列中数据不完全一样。 Bit 由 1 或者 0 组成。当表示真或者假、 ON 或者 OFF 时,使用 Bit 数据类型。例如,询问是否是每一次访问的客户机请求可以存储在这种数据类型的列中。
( 六 ) 日期和时间类型
11
日期和时间数据类型包括 datetime 和 smalldatetime两种类型。 日期和时间数据类型由有效的日期和时间组成。例如,有效的日期和时间数据包括“ 4/01/98 12:15:00:00:00 pm”和“ 1:28:29:15:01am 8/17/98” 。前一个数据类型是日期在前,时间在后。后一个数据类型是时间在前,日期在后。在 SQL Server 中,日期和时间数据类型包括 datetime 和 smalldatetime 两种,所存储的日期范围是从 1753 年 1 月 1 日开始,到 9999 年 12 月 31 日结束 (每一个值要求 8 个存储字节 )。使用 smalldatetime 数据类型时,所存储的日期范围是 1900年 1 月 1 日 开始,到 2079 年 12 月 31 日结束 (每一个值要求 4 个存储字节 )。
日期的格式可以设定。设置日期格式的命令如下: SET dateformat {format | @format _var|} 其中, format | @format_var 是日期的顺序。有效的参数包括 mdy、 dmy、 ymd、 ydm、myd 和 dym 。在默认情况下,日期格式为mdy (月日年)。 例如,当执行 set dateformat ymd 之后,日期的格式为年月日形式;当执行 set dateformat dmy 之后,日期的格式为日月年形式。
( 七 ) 其他数据类型
12
其他数据类型包括二进制数据类型( Binary、 image、 varbinary )和其他数据类型( Cursor、 timestamp 、 SQL_variant 、 Uniqueidentifier、 table 、 xml)
1 .二进制数据类型
二进制数据包括 binary、 varbinary 和 image 。 binary 数据类型既可以是固定长度的 (binary),也可以是变长度的。
binary 是 n 位固定的二进制数据。其中, n 的取值范围是从 1 到 8000 。其存储空间的大小是 n + 4 个字节。
varbinary 是 n 位变长度的二进制数据。其中, n 的取值范围是从 1 到 8000 。其存储空间的大小是 n + 4 个字节,不是 n 个字节。
在 image 数据类型中存储的数据是以位字符串存储的,不是由 sql server 解释的,必须由应用程序来解释。例如,应用程序可以使用 bmp、 tief、 gif 和 jpeg 格式把数据存储在 image 数据类型中。
13
其他数据类型
2 .其他数据类型
Timestamp 用于表示 SQL Server 活动的先后顺序,以二进制的格式表示。 Timestamp 数据与插入数据或者日期和时间没有关系。 Uniqueidentifier 由 16 字节的十六进制数字组成,表示一个全局唯一的。当表的记录行要求唯一时,GUID 是非常有用。例如,在客户标识号列使用这种数据类型可以区别不同的客户。 Cursor 这是变量或存储过程 OUTPUT 参数的一种数据类型,这些参数包含对游标的引用。使用 Cursor 数据类型创建的变量可以为空。 sql_variant 用于存储 SQL Server 2005 支持的各种数据类型(不包括 text、 ntext、 image、 timestamp 和 sql_variant )的值。 在 SQL Server 2005 中,表( table )作为一种特殊的数据类型,用于存储结果集以进行后续处理。 table 主要用于临时存储一组作为表值函数的结果集返回的行。 SQL Server 2005 中引入了一种新的存储类型—— XML ,它是用于存储 XML 数据的数据类型,可以在列中或者 XML 类型的变量中存储 XML 实例。
第二节 使用 Management Studio 管理表
14
SQL Server 2005的Management Studio功能相当强大。用户可以使用它的图形工具创建、修改、重命名和删除表。
修改表
删除表
创建表
重命名表
( 一 ) 创建表
15
使用 Management Studio创建 Classes 表的步骤如下: ( 1 )在【对象资源管理器】窗口中,选择要创建表的数据库【 Student】,在【表】节点上单击鼠标右键,弹出快捷菜单,如图 5.2 所示,选择【新建表(N)… 】命令。
( 2 )在【对象资源管理器】窗口的右侧出现如图 5.3 所示窗口,在【列名】输入列名;在【数据类型】列选择合适的数据类型;【允许空】列用于设置是否允许 NULL值。采用同样的方法,输入如图 5.1 所示的 4 个字段,分别设置好各字段的类型。这里不将这些列设置为“允许空”。
图 5.2 创建表
16
创建表
当然,也可以用图 5.3 所示窗口下半部分的【列属性】页来设置当前创建的页的某些属性。保存这个表为“ Classes” 表。
( 3 )用户可以为表添加主键将“ Class_id”设置为主键。在“ Class_id” 列前面的黑色三角形处单击鼠标右键,弹出快捷菜单,如图5.4 所示,选择【设置主键】命令。
图 5.3 创建表页面属性 图 5.4 设置主键
17
创建表
( 4 )因为这个“ Classes” 表用于连接“ Departments” 表和“ Teachers” 表,所以这里要为“ Class_department” 字段和“ Class_teacherid” 字段设置外键。选择【关系(H)...】命令,出现【外键关系】对话框,单击添加按钮,出现如图 5.5 所示,在页面右侧【表和列规范】一行点击 按钮。将【标识】名称设置为 FK_class_department 。注:标识名称可以任意设置,但是为了规范,“ FK_class_department” 中的“ FK” 表示外键,“ class”和“ department” 用于标示有关系的两个表。
图 5.5 【外键关系】对话框
18
创建表
( 5 )此时出现如图 5.6 所示的【表和列】对话框,单击【主键表】下拉列表,选择主建表,然后选择【主键表】对应下拉列表中的相对应字段,选择主键;同样在【外键表】的下拉列表中选择组成外键的列。单击【确定】按钮。按照同样的方法,创建名称为“ FK_ class _teacher” 的关系。 ( 6 )完成表的创建。
图 5.6 设置主键和外键
( 二 ) 修改表
19
表创建好以后,用户有时需要根据需求更改已经创建的表,用户可以使用Management Studio 修改表。具体采用 Management Studio 修改表的步骤如下:( 1 )在【对象资源管理器】窗口中,单击数据库【 Student】节点前“ +” 号,展开数据库节点;在需要修改【表】节点上单击鼠标右键,弹出快捷菜单,如图5.7 所示,选择【修改 (Y)… 】命令。( 2 )选择【修改 (Y)… 】命令后会在【对象资源管理器】右边出现表的结构窗口,如图 5.8 所示。
图 5.7 修改表 图 5.8 表窗口
修改表
20
( 3 )完成表的修改以后,选择Management Studio 中的【文件】菜单中的【保存 (S) Classes】命令保存修改好的表,也可以使用快捷键“ Ctrl+s” 保存,如图 5.9 所示。
图 5.9 保存修改好的表
21
修改表
( 4 )建好的表如果有外键,在保存时系统会提示相关的表格也要保存,如图 5.10 所示。
图 5.10 保存有关联的表
22
( 三 ) 重命名表
有时候需要对表的名称进行修改。使用 Management Studio 重命名表的步骤如下:( 1 )在【对象资源管理器】窗口中,单击数据库【 student】节点前“ +”号,展开数据库节点;在需要修改【表】节点上单击鼠标右键,弹出快捷菜单,如图 5.11 所示,选择【重命名(M)】命令。( 2 )键入要更改的表名,在任意位置单击鼠标,就完成了表的重命名。如图5.12 所示。
图 5.11 重命名表 图 5.12 为表录入新名称
( 四 ) 删除表
23
当用户不再需要某个表示可以删除这个表。使用 Management Studio删除表的步骤如下:( 1 )在【对象资源管理器】窗口中,单击数据库【 Student】节点前“ +”号,展开数据库节点;在需要修改【表】节点上单击鼠标右键,弹出快捷菜单,如图 5.13 所示,选择【删除( D )】命令。
图 5.13 删除表
( 2 )出现【删除对象】窗口,窗口中显示出要删除的对象,单击【确定】按钮,完成对表的删除。
第三节 使用 T-SQL 管理表
24
用户可以使用图形化工具 Management Studio 管理表,也可以使用T-SQL 语言方便快速地管理表。
A B
DC
修改表
重命名表
创建表
删除表
25
( 一 ) 创建表 下面列出了创建表的 T-SQL 语法,其中包含了表的定义。列的约束和索引会在后面的内容中讲解。
CREATE TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name ( { <column_definition> | <computed_column_definition> } [ <table_constraint> ] [ ,...n ] ) [ ON { partition_scheme_name ( partition_column_name ) | filegroup | "default" } ] [ { TEXTIMAGE_ON { filegroup | "default" } ] [ ; ] <computed_column_definition> ::=column_name AS computed_column_expression [ PERSISTED [ NOT NULL ] ][ [ CONSTRAINT constraint_name ] { PRIMARY KEY | UNIQUE } [ CLUSTERED | NONCLUSTERED ] [ WITH FILLFACTOR = fillfactor | WITH ( <index_option> [ , ...n ] ) ] | [ FOREIGN KEY ] REFERENCES referenced_table_name [ ( ref_column ) ] [ ON DELETE { NO ACTION | CASCADE } ] [ ON UPDATE { NO ACTION } ] [ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression ) [ ON { partition_scheme_name ( partition_column_name ) | filegroup | "default" } ]] < table_constraint > ::=[ CONSTRAINT constraint_name ] { { PRIMARY KEY | UNIQUE } [ CLUSTERED | NONCLUSTERED ] (column [ ASC | DESC ] [ ,...n ] ) [ WITH FILLFACTOR = fillfactor |WITH ( <index_option> [ , ...n ] ) ] [ ON { partition_scheme_name (partition_column_name) | filegroup | "default" } ] | FOREIGN KEY ( column [ ,...n ] ) REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ] [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] [ NOT FOR REPLICATION ] | CHECK [ NOT FOR REPLICATION ] ( logical_expression ) }
26
创建表
下面对部分参数进行说明,其他参数请读者参考 SQL Server 的联机丛书。
database_name 在其中创建表的数据库的名称。 database_name 必须指定现有数据库的名称。如果未指定,则 database_name 默认为当前数据库。当前连接的登录名必须与 database_name 所指定数据库中的一个现有用户 ID 关联,并且该用户 ID 必须具有 CREATE TABLE 权限。
schema_name 新表所属架构的名称。
table_name 新表的名称。表名必须遵循标识符规则。除了本地临时表名(以单个数字符号 (#) 为前缀的名称)不能超过 116 个字符外, table_name 最多可包含 128 个字符。
column_name 表中列的名称。列名必须遵循标识符规则,并在表中唯一。 column_name 可包含 1 至 128 个字符。对于使用 timestamp 数据类型创建的列,可以省略 column_name 。如果未指定 column_name ,则 timestamp 列的名称将默认为 timestamp 。
max 只适用于 varchar、 nvarchar和 varbinary 数据类型,用于存储 2^31 个字节的字符和二进制数据,以及 2^30 个字节的 Unicode 数据。
27
创建表
DEFAULT 如果在插入过程中未显式提供值,则指定为列提供的值。 DEFAULT 定义可适用于除定义为 timestamp 或带 IDENTITY 属性的列以外的任何列。如果为用户定义类型列指定了默认值,则该类型应当支持从 constant_expression 到用户定义类型的隐式转换。删除表时,将删除 DEFAULT 定义。只有常量值(例如字符串)、标量函数(系统函数、用户定义函数或 CLR 函数)或 NULL 可用作默认值。为了与 SQL Server 的早期版本兼容,可以为 DEFAULT 分配约束名称。
constant_expression 是用作列的默认值的常量、 NULL 或系统函数。
IDENTITY 指示新列是标识列。在表中添加新行时,数据库引擎将为该列提供一个唯一的增量值。标识列通常与 PRIMARY KEY 约束一起用作表的唯一行标识符。可以将 IDENTITY 属性分配给 tinyint、 smallint、 int、 bigint、 decimal(p,0) 或 numeric(p,0) 列。每个表只能创建一个标识列。不能对标识列使用绑定默认值和 DEFAULT 约束。必须同时指定种子和增量,或者两者都不指定。如果二者都未指定,则取默认值 (1,1) 。
28
创建表例题
例 5-1 :使用 T-SQL 语句创建 test 表。USE StudentGOCREATE TABLE test(
Class_id char(8) NOT NULL,Class_name nvarchar(16) NOT NULL,Class_department char(3) NOT NULL,Class_teacherid char(5) NOT NULL,
)在查询编辑器窗口中输入以上语句以后,单击 按钮,结果如图 5.14 所示。
图 5.14 执行 T-SQL 语句创建表
( 二 ) 修改表
29
SQL Server 使用“ ALTER TABLE” 语句修改表。 ALTER TABLE 语句语法如下:
ALTER TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name { ALTER COLUMN column_name { [ type_schema_name. ] type_name [ ( { precision [ , scale ] | max | xml_schema_collection } ) ] [ COLLATE collation_name ] [ NULL | NOT NULL ] | {ADD | DROP } { ROWGUIDCOL | PERSISTED } | DROP NOT FOR REPLICATION } }[ ; ]
30
修改表
下面对部分参数进行说明,其他参数请读者参考 SQL Server 的联机丛书。
database_name 要在其中创建表的数据库的名称。
table_name 要更改的表的名称。如果表不在当前数据库中,或者不包含在当前用户所拥有的架构中,则必须显式指定数据库和架构。
ALTER COLUMN 指定要更改命名列。
31
修改表例题
例 5-2 :建立一个表“ tabletest” ,有两个字段column1, column2, column1 的类型为整形, column2 的类型为varchar( 20 ),不允许为空,然后再删除表中的 column2 字段。CREATE TABLE tabletest ( column1 INT, column2 VARCHAR(20) NULL) ;GOALTER TABLE tabletest DROP COLUMN column2 ;GO 执行第一个 CREATE TABLE 语句后如图 5.15 所示,执行 ALTER TABLE 语句后如图 5.16 所示。
图 5.15 创建表“ tabletest” 图 5.16 修改表
( 三 ) 重命名表
32
重命名表,要用到系统存储过程 sp_rename 。具体的语法这里不作讲解,下面仅以示例来说明使用 sp_rename 前后数据表名称的变化。 在查询分析器中输入:
Use student Go Exec sp_rename ‘tabletest’,’newtable-test’ 输入前后数据表名的变化如图 5.17, 5.18 所示。
图 5.17 修改前
图 5.18 修改后
( 四 ) 删除表
33
要删除上一节建立的“ newtable-test” 表,可以在查询分析器窗口中输入以下 T-SQL 语句:
USE Student Go DROP TABLE [newtable-test]
第四节 实现 SQL Server 2005 的数据完整性
34
数据完整性介绍 主键与外键 列约束和默认值
( 一 ) 数据完整性介绍
35
所谓数据完整性就是指数据库中数据的正确性和一致性,是指数据的精确性( Accuracy ) 和可靠性( Reliability ),它是应防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。利用数据的完整性约束,可以保证数据库中数据的质量。因此,在进行表的设计时,一定要注意到对数据完整性的设计。
在 SQL Server 2005 中,一般有以下四类完整性: 域完整性:对具体一列上的数据的有效性限制。域完整性指特定列的项的有效性。可以强制域完整
性限制类型(通过使用数据类型)、限制格式(通过使用 CHECK 约束和规则)或限制可能值的范围(通过使用 FOREIGN KEY 约束、 CHECK 约束、 DEFAULT 定义、 NOT NULL 定义和规则)。
实体完整性:保证表中所有的行都是惟一的,以确保所有的记录都是可以区分的。实体完整性将行定义为特定表的唯一实体。实体完整性通过 UNIQUE 索引、 UNIQUE 约束或 PRIMARY KEY 约束,强制表的标识符列或主键的完整性。
引用完整性:这是对涉及两个或两个以上表的数据的一致性维护。输入或删除行时,引用完整性保留表之间定义的关系。在 SQL Server 2005 中,引用完整性通过 FOREIGN KEY 和 CHECK 约束,以外键与主键之间或外键与唯一键之间的关系为基础。引用完整性确保键值在所有表中一致。这类一致性要求不引用不存在的值,如果一个键值发生更改,则整个数据库中,对该键值的所有引用要进行一致的更改。
用户定义完整性:用户定义完整性可以定义不属于其他任何完整性类别的特定业务规则。所有完整性类别都支持用户定义完整性。这包括 CREATE TABLE 中所有列级约束和表级约束、存储过程以及触发器。
( 二 ) 主键与外键
36
在前面创建表的时候,曾提到过主键和外键。下面继续对主键和外键进行详细的描述。
主键:保证数据唯一且非空( not null ),表的记录必须得有唯一区分的字段,主键主要是用于其他表的外键关联,本记录的修改与删除,当表没有主键时,这些操作会变的非常麻烦。一个表只能有一个主键。
外键:引用完整性表示得到正常维护的表之间的关系。表中的数据只应指向另一个表中的现有行,不应指向不存在的行。
例如, Classes 表和 Teachers 表之间的关系。每个班对应了一个班主任,而在班级信息数据表中只有班级班主任的代码。要查询到班级班主任的姓名,必须要对下面两个表建立关系。也就是说一个班主任可以对应多个班级,而一个班级只能对应一个班主任。若要查询某班的班主任,必须要将班级信息数据表的 Class_teacherid设置为外键,用于连接教师信息数据表的主键 Teacher_id 。
37
主键与外键
列名 数据类型 大小 字段描述
Class_id char 8 记录班级号,设为主键
Class_name nvarchar 16 班级全称
Class_department char 3 记录班级所在系别
Class_teacherid char 5 记录本班级班主任号(设为外键)
列名 数据类型 大小 字段描述
Teacher_id char 5 记录教师号,设为主键
Teacher_name nvarchar 30 记录教师姓名
Teacher_department char 3 记录教师所在系
表 5-2 班级信息数据表( Classes )
表 5-3 教师信息数据表( Teachers )
( 三 ) 列约束和默认值
38
1. 列约束 通过约束可以定义 SQL Server 2005 数据库引擎,自动强制实施数据库完整性的方式。约束定义关于列中允许值的规则,是强制实施完整性的标准机制。使用约束优先于使用 DML 触发器、规则和默认值。另外,查询优化器也使用约束定义生成高性能的查询执行计划。SQL Server 2005 支持下列约束类:
NOT NULL 指定列不接受 NULL值。 CHECK约束通过限制可放入列中的值来强制实施域完整性。有关详细信息,请参阅 CHECK约束。 CHECK约束指定应用于为列输入的所有值的布尔值(计算结果为TRUE、 FALSE或未知)搜索条件。所有计算结果为 FALSE 的值均被拒绝。可以为每列指定多个 CHECK约束。下面的示例中创建了约束 chk_id 。此外,此约束通过确保只为该键输入指定范围内的数字来强制实施主键的域。
UNIQUE约束强制实施列集中值的唯一性。根据 UNIQUE约束,表中的任何两行都不能有相同的列值。另外,主键也强制实施唯一性,但主键不允许 NULL 作为一个唯一值。
PRIMARY KEY约束标识具有唯一标识表中行的值的列或列集。有关详细信息,请参阅 PRIMARY KEY约束。在一个表中,不能有两行具有相同的主键值。不能为主键中的任何列输入 NULL值。建议使用一个小的整数列作为主键。每个表都应有一个主键。限定为主键值的列或列组合称为候选键。
FOREIGN KEY约束标识并强制实施表之间的关系。
39
列约束和默认值
约束可以是列约束,也可以是表约束。列约束指定为列定义的一部分,并且只应用于该列。前面的示例中的约束是列约束。表约束的声明与列定义无关,可以应用于表中多个列。当一个约束中必须包含多个列时,必须使用表约束。 例如,如果一个表的主键有两个或两个以上的列,则必须使用表约束将这些列包含在主键内。假设有一个记录工厂内的一台计算机上所发生的事件的表,假设可以同时发生几类事件,但不能同时发生两个属于同一类型的事件。可以通过在表的两列主键中同时包含 event_type 列和 event_time 列强制实施这一点,如以下示例中所示:CREATE TABLE factory (event_type int, event_time datetime, event_site char(50), event_desc char(1024),CONSTRAINT event_key PRIMARY KEY (event_type, event_time) )
40
2. 默认值
如果插入行时没有为列指定值,默认值则指定列中使用什么值。默认值可以是计算结果为常量的任何值,例如常量、内置函数或数学表达式。 若要应用默认值,可以通过在 CREATE TABLE 中使用 DEFAULT 关键字来创建默认值定义。这将为每一列分配一个常量表达式作为默认值。
列约束和默认值
第五节 查看表属性
41
表是组成数据库的基本元素,不管是在数据库的管理维护中,还是在数据库使用中,都需要去了解表的基本属性。可以通过 Management Studio 查看表属性,其步骤如下: ( 1 )在【对象资源管理器】窗口中,选择要查看表属性的数据库【 Student】,在【表】节点上单击鼠标左键,显示数据库中的表,在要查看属性的表上单击鼠标右键,弹出快捷菜单,如图 5.19 所示,选择【属性 (R)】命令。
图 5.19 查看表属性
42
查看表属性
( 2 )出现如图 5.20 所示的【表属性】窗口。用户可以查看表的一些基本属性,但是不能够修改。表属性页中包含了常规属性、权限设置和扩展属性。
图 5.20 表属性页
43
查看表属性
( 3 )如果要为表添加权限,可以选择【选择页】中的权限,如图 5.21 。
图 5.21 【选择页】中的权限
44
查看表属性
( 4 )如果要添加一个用户访问表的权限,鼠标点击图中的【添加】按钮,弹出如图 5.22 所示的【选择用户或角色】页面,点击图中【浏览】按钮,选择需要添加的用户名称,这里使用 public 用户。完成用户添加。
图 5.22 【选择用户或角色】页面
45
查看表属性
( 5 )点击【确定】按钮,用户 public 的权限将在图中的显示权限位置显示,如图 5.23 。在这里可以设置用户对数据库的操作权限。
图 5.23 设置表权限
第六节 实训:表的使用和管理
46
1 .实训任务( 1 )创建和修改表 Classes 。( 2 )创建 Student 数据库中的其他 9 个表。
2 .实训指导 分析:可以使用图形管理工具,通过在查询分析器中输入 SQL 语句创建表和修改表。
3 .实现步骤 ( 1 )使用 Management Studio 的“新建查询”创建和修改表“ Classes” 。在服务器的“ Student” 数据库中创建一个表名为“ Classes” ,它包含以下字段:Class_id( char )、 Class_name( nvarchar )、 Class_department( char )、 Class_teacherid( char )、 Memo( text )。其中主键为Class_id ,除 Memo 字段可以为空以外,其他都不能为 NULL值。并且建立两个外键 Class_teacherid和 Class_department 。创建好了以后,再将Memo 字段删除。
47
实训:表的使用和管理
具体步骤如下: ① 打开Management Studio ,点击 按钮,出现新的查询录入窗口,如图 5.24 所示。
图 5.24 新建查询
48
实训:表的使用和管理② 在窗口中输入以下语句创建表:USE StudentGO CREATE TABLE Classes(
Class_id char(8) COLLATE NOT NULL,Class_name nvarchar(16) COLLATE NOT NULL,Class_department char(3) COLLATE NOT NULL,Class_teacherid char(5) COLLATE NOT NULL,
CONSTRAINT PK_Class PRIMARY KEY CLUSTERED (
Class_id ASC)WITH (IGNORE_DUP_KEY = OFF) ON PRIMARY) ON PRIMARYUSE StudentGOALTER TABLE Classes WITH CHECK ADD CONSTRAINT FK_Class_department FOREIGN KEY(Class_department)REFERENCES Departments (Department_id)GOALTER TABLE Classes WITH CHECK ADD CONSTRAINT FK_Class_Teacher FOREIGN KEY(Class_teacherid)REFERENCES Teachers (Teacher_id)GO
49
实训:表的使用和管理
运行以后界面如图 5.25 所示:
图 5.25 新建的 classes 表
50
实训:表的使用和管理
③ 然后输入以下语句,删除 Memo 字段。运行后, Memo 字段被删除。 USE StudentGOALTER TABLE Classes DROP COLUMN Memo运行结果如图 5.26 所示。
图 5.26 删除 Memo字段
51
实训:表的使用和管理
( 2 )创建 Student 数据库中的其它表
采用上面同样的方法建立 Student 数据库中的其余表。下面提供了创建这些表的 T-SQL 代码,供读者参考。表结构与表间的主键外键依赖关系请参见第 15 章的 15.4 节的内容。① Course_kind 表USE StudentGOCREATE TABLE Course_kind( kind_id char(2) NOT NULL, kind_name nvarchar(50) NULL, CONSTRAINT PK_Course_kind PRIMARY KEY CLUSTERED (
kind_id ASC) ON PRIMARY
52
实训:表的使用和管理② Courses 表USE StudentGOCREATE TABLE Courses(
Course_id char(4) NOT NULL,Course_name nvarchar(30) NULL,Course_period tinyint NULL,Course_credit tinyint NULL,Course_kind char(2) NULL,Course_describe ntext NULL,
CONSTRAINT PK_course PRIMARY KEY CLUSTERED (
Course_id ASC) ON PRIMARY TEXTIMAGE_ON PRIMARY
USE StudentGOALTER TABLE Courses WITH CHECK ADD CONSTRAINT FK_course_Course_kind FOREIGN KEY (Course_kind)REFERENCES Course_kind (kind_id)
53
实训:表的使用和管理
③ Departments 表
USE StudentGOCREATE TABLE Departments(
Department_id char(3) NOT NULL,Department_name nvarchar(50) NULL,
CONSTRAINT PK_department PRIMARY KEY CLUSTERED (
Department_id ASC)WITH (IGNORE_DUP_KEY = OFF) ON PRIMARY) ON PRIMARY
54
实训:表的使用和管理
④ Nations 表
USE StudentGOCREATE TABLE Nations(
Nation_id char(2) NOT NULL,Nation_name nvarchar(8) NOT NULL,
CONSTRAINT PK_nation PRIMARY KEY CLUSTERED (
Nation_id ASC)WITH (IGNORE_DUP_KEY = OFF) ON PRIMARY, CONSTRAINT IX_nation UNIQUE NONCLUSTERED (
Nation_name ASC)WITH (IGNORE_DUP_KEY = OFF) ON PRIMARY) ON PRIMARY
55
实训:表的使用和管理⑤Student_course 表USE StudentCREATE TABLE Student_course(
SC_id bigint IDENTITY(1,1) NOT NULL,Student_id char(8) NULL,Course_id char(4) NULL,Student_grade tinyint NULL,Course_year tinyint NULL,
CONSTRAINT PK_student_course PRIMARY KEY CLUSTERED (
SC_id ASC)WITH (IGNORE_DUP_KEY = OFF) ON PRIMARY) ON PRIMARY USE StudentGOALTER TABLE Student_course WITH CHECK ADD CONSTRAINT FK_student_course_course FOREIGN KEY(Course_id)REFERENCES Courses (Course_id)GOALTER TABLE Student_course WITH CHECK ADD CONSTRAINT FK_student_course_Student FOREIGN KEY(Student_id)REFERENCES Students (Student_id)
56
实训:表的使用和管理⑥Students 表USE StudentGOCREATE TABLE Students(
Student_id char (8) NOT NULL,Student_name nvarchar(10) NOT NULL,Student_sex char (2) NOT NULL,Student_nation char (2) NULL,Student_birthday smalldatetime NULL,Student_time smalldatetime NULL,Student_classid char (8) NOT NULL,Student_home nvarchar(50) NULL,Student_else ntext NULL,
CONSTRAINT PK_Student PRIMARY KEY CLUSTERED (
Student_id ASC)WITH (IGNORE_DUP_KEY = OFF) ON PRIMARY ) ON PRIMARY TEXTIMAGE_ON PRIMARY GOUSE StudentGOALTER TABLE Students WITH CHECK ADD CONSTRAINT FK_Student_Class FOREIGN KEY(Student_classid)REFERENCES Classes] (Class_id)GOALTER TABLE Students WITH CHECK ADD CONSTRAINT FK_Student_nation FOREIGN KEY(Student_nation)REFERENCES Nations (Nation_id)ON UPDATE CASCADE
57
实训:表的使用和管理⑦Teacher_course 表USE StudentCREATE TABLE Teacher_course](
Tc_id int IDENTITY(1,1) NOT NULL,Teacher_id char (5) NULL,Course_id char (4) NULL,Class_id char (8) NULL,Course_year tinyint NULL,
CONSTRAINT PK_teacher_course PRIMARY KEY CLUSTERED (
Tc_id ASC)WITH (IGNORE_DUP_KEY = OFF) ON PRIMARY ) ON PRIMARY USE StudentGOALTER TABLE Teacher_course WITH CHECK ADD CONSTRAINT FK_teacher_course_Class FOREIGN KEY(Class_id)REFERENCES Classe] (Class_id)GOALTER TABLE Teacher_course WITH CHECK ADD CONSTRAINT FK_teacher_course_course FOREIGN KEY(Course_id)REFERENCES Courses [Course_id)GOALTER TABLE Teacher_course WITH CHECK ADD CONSTRAINT FK_teacher_course_Teacher FOREIGN KEY(Teacher_id)REFERENCES Teachers (Teacher_id)
58
实训:表的使用和管理
⑧Teachers 表USE StudentCREATE TABLE Teachers(
Teacher_id char (5) NOT NULL,Teacher_name nvarchar(30) NOT NULL,Teacher_department char (3) NULL,
CONSTRAINT [PK_Teacher PRIMARY KEY CLUSTERED (
Teacher_id ASC)WITH (IGNORE_DUP_KEY = OFF) ON PRIMARY ) ON PRIMARY GOUSE StudentGOALTER TABLE Teachers WITH CHECK ADD CONSTRAINT FK_Teacher_department FOREIGN KEY(Teacher_department)REFERENCES Departments (Department_id)
59
实训:表的使用和管理
⑨Users 表USE StudentCREATE TABLE Users(
user_id char (3) NOT NULL,User_name nvarchar(15) NULL,User_Password varchar(15) NOT NULL,User_Power tinyint NOT NULL,
CONSTRAINT PK_user PRIMARY KEY CLUSTERED (
user_id ASC)WITH (IGNORE_DUP_KEY = OFF) ON PRIMARY ) ON PRIMARY
本章小节
60
经过这一章的学习,相信读者对表的管理和使用已经有了一定的了解了。表作为数据库的一个重要元素,是用于存储数据的对象。用户可以通过多种方式访问数据库中的数据。表是由行和列组成的。一行就是一条记录,是数据对象的一个实例。一列就是事物的属性,也成为字段。
我们学习了使用 Management Studio 的图形界面和查询界面来创建、修改、重命名、删除一个表。以及在表中怎样实现数据完整性等一些基本知识。希望读者在阅读完本章以后,能够继续学习相关表的管理知识。在下一章中我们将为大家介绍数据库中索引的使用和管理。
习 题
61
理论题1 .填空题( 1 )在 SQL Server 2005 中,有以下 4 类完整性描述: ________、 __________、 __________和________ 。( 2 )在 SQL Server 2005 ,每个数据库最多包含 __________ 个表;每个表包含 ______ 个列。( 3 )在 SQL Server 2005 中,表所包含的数据类型有___________、 ___________、 ____________、 ____________、 ____________ 等。( 4 ) SQL Server 2005 支持下列约束:___________、 ___________、 ____________、 _________、 _________ 。2 .判断题( 1 )一个数据库的最小单位是表。 ( )( 2 )一个表的主键可以有多个。 ( )( 3 )如果一个表有外键,那么表中的数据只应指向另一个表中的现有行,不应指向不存在的行。 ( )( 4 )删除了表以后,表中的所有信息都会丢失。 ( ) ( 5 )一个表创建好以后就不能进行修改了。 ( )( 6 )用户可以给列创建约束,也可以为表创建约束 ( )3 .思考题( 1 )什么是表的主键?什么是表的外键?请举例说明。( 2 )什么叫系统表? SQL Server 2005 包含哪些系统表?它们分别有什么作用?
操作题 为 Student 数据库创建一个表 Student_info ,包含以下字段:Student_id( char )、 Student_name( varchar )、 Student_sex( char )、 Student_birthday ( datetime )、 Student_address( varchar )。其中主键为 Student_id ,并且所有字段都不允许为 NULL 。
本章结束
62