620 likes | 696 Views
第五章 表的使用和管理. 本章主题. 表的定义 能存储的不同数据类型 如何存储表以及将表存储于何处 使用 SSMS 和查询编辑器创建表 表的创建中所包含的更高级的部分 图片和大型文本数据. 表的使用和管理. 数据库是表的集合,表中含有数据和一些其他的一些对象,表是用来存储数据的对象。用户可以通过多种方式访问数据库中的数据,但是归根到底是访问表中的数据。所以掌握 SQL Server 的表的管理和使用是非常重要的。本章将讲解 SQL Server 2005 表的管理和使用,主要包括: 表的基本概念。 使用 Management Studio 创建、修改和删除表。
E N D
本章主题 • 表的定义 • 能存储的不同数据类型 • 如何存储表以及将表存储于何处 • 使用SSMS和查询编辑器创建表 • 表的创建中所包含的更高级的部分 • 图片和大型文本数据
表的使用和管理 • 数据库是表的集合,表中含有数据和一些其他的一些对象,表是用来存储数据的对象。用户可以通过多种方式访问数据库中的数据,但是归根到底是访问表中的数据。所以掌握SQL Server的表的管理和使用是非常重要的。本章将讲解SQL Server 2005表的管理和使用,主要包括: • 表的基本概念。 • 使用Management Studio创建、修改和删除表。 • 使用T-SQL创建、修改和删除表。 • 实现SQL Server 2005的数据完整性。 • 通过本章学习,读者可以掌握数据库中表的基本知识和对表的基本操作。
数据类型 系统表简介 字符数据类型 表 其他数据类型 数字数据类型 日期和时间类型 第一节 表的基本概念
(一) 表 • 表是数据库中存储的数据库对象。表定义是一个列集合。数据在表中的组织方式与在电子表格中相似,都是按行和列的格式组织的。每一行代表一条唯一的记录,每一列代表记录中的一个字段。例如,在包含班级数据的表中,每一行代表一个班级,各列分别代表该班级的信息,如班级编号、班级名称、所属院系代码、班主任ID等。 • 在SQL Server 2005 中,每个数据库最多可包含20 亿个表,每个表可包含1,024 列。表的行数及总大小仅受可用存储空间的限制。每行最多包括8,060 个字节。 • SQL Server 2005 中的表包括下列主要组件: • 列:每一列代表由表建模的对象的某个属性,例如,一个部件表有ID 列、颜色列和重量列。 • 行:每一行代表由表建模的对象的一个单独的实例。例如,公司运送的每个部件在部件表中均占一行。 • 如图5.1所示,是本书案例数据库Student中Classes(班级)表的内容。 图5.1 Classes表
(二) 系统表简介 系统表用来保存一些服务器配置信息数据,和系统数据库一样,用户不能直接查看和修改系统表,这些表在什么地方呢?SQL Server 2005中的系统数据现在存储在隐藏的“资源”表中,这个表只能被服务器自身直接访问。 SQL Server 2005中有很多自带的系统表,这些表都有各自的作用,表5-1分别描述了系统表的所属及其作用。 表5-1 系统表的所属及其作用
(三) 数据类型 • 在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。
(四) 字符数据类型 • 字符数据类型包括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。
字符数据类型 下面将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 个字符。
(五) 数字数据类型 数字数据只包含数字。数字数据类型包括正数和负数、小数(浮点数)和整数。 整数由正整数和负整数组成,例如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 数据类型。例如,询问是否是每一次访问的客户机请求可以存储在这种数据类型的列中。
(六) 日期和时间类型 日期和时间数据类型包括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 之后,日期的格式为日月年形式。
(七) 其他数据类型 • 其他数据类型包括二进制数据类型(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 数据类型中。
其他数据类型 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管理表 创建表 SQL Server 2005的Management Studio功能相当强大。用户可以使用它的图形工具创建、修改、重命名和删除表。 修改表 删除表 重命名表
(一) 创建表 使用Management Studio创建Classes表的步骤如下: (1)在【对象资源管理器】窗口中,选择要创建表的数据库【Student】,在【表】节点上单击鼠标右键,弹出快捷菜单,如图5.2所示,选择【新建表(N)… 】命令。 图5.2 创建表 (2)在【对象资源管理器】窗口的右侧出现如图5.3所示窗口,在【列名】输入列名;在【数据类型】列选择合适的数据类型;【允许空】列用于设置是否允许NULL值。采用同样的方法,输入如图5.1所示的4个字段,分别设置好各字段的类型。这里不将这些列设置为“允许空”。
创建表 当然,也可以用图5.3所示窗口下半部分的【列属性】页来设置当前创建的页的某些属性。保存这个表为“Classes”表。 图5.3 创建表页面属性 图5.4 设置主键 (3)用户可以为表添加主键将“Class_id”设置为主键。在“Class_id”列前面的黑色三角形处单击鼠标右键,弹出快捷菜单,如图5.4所示,选择【设置主键】命令。
创建表 (4)因为这个“Classes”表用于连接“Departments”表和“Teachers”表,所以这里要为“Class_department”字段和“Class_teacherid”字段设置外键。选择【关系(H)...】命令,出现【外键关系】对话框,单击添加按钮,出现如图5.5所示,在页面右侧【表和列规范】一行点击按钮。将【标识】名称设置为FK_class_department。 注:标识名称可以任意设置,但是为了规范,“FK_class_department”中的“FK”表示外键,“class”和“department”用于标示有关系的两个表。 图5.5 【外键关系】对话框
创建表 (5)此时出现如图5.6所示的【表和列】对话框,单击【主键表】下拉列表,选择主建表,然后选择【主键表】对应下拉列表中的相对应字段,选择主键;同样在【外键表】的下拉列表中选择组成外键的列。单击【确定】按钮。按照同样的方法,创建名称为“FK_ class _teacher”的关系。 (6)完成表的创建。 图5.6 设置主键和外键
(二) 修改表 表创建好以后,用户有时需要根据需求更改已经创建的表,用户可以使用Management Studio修改表。具体采用Management Studio修改表的步骤如下: (1)在【对象资源管理器】窗口中,单击数据库【Student】节点前“+”号,展开数据库节点;在需要修改【表】节点上单击鼠标右键,弹出快捷菜单,如图5.7所示,选择【修改(Y)… 】命令。 (2)选择【修改(Y)… 】命令后会在【对象资源管理器】右边出现表的结构窗口,如图5.8所示。 图5.7 修改表 图5.8 表窗口
修改表 (3)完成表的修改以后,选择Management Studio中的【文件】菜单中的【保存(S) Classes】命令保存修改好的表,也可以使用快捷键“Ctrl+s”保存,如图5.9所示。 图5.9 保存修改好的表
修改表 (4)建好的表如果有外键,在保存时系统会提示相关的表格也要保存,如图5.10所示。 图5.10 保存有关联的表
(三) 重命名表 有时候需要对表的名称进行修改。使用Management Studio重命名表的步骤如下: (1)在【对象资源管理器】窗口中,单击数据库【student】节点前“+”号,展开数据库节点;在需要修改【表】节点上单击鼠标右键,弹出快捷菜单,如图5.11所示,选择【重命名(M)】命令。 (2)键入要更改的表名,在任意位置单击鼠标,就完成了表的重命名。如图5.12所示。 图5.11 重命名表 图5.12 为表录入新名称
(四) 删除表 当用户不再需要某个表示可以删除这个表。使用Management Studio删除表的步骤如下: (1)在【对象资源管理器】窗口中,单击数据库【Student】节点前“+”号,展开数据库节点;在需要修改【表】节点上单击鼠标右键,弹出快捷菜单,如图5.13所示,选择【删除(D)】命令。 图5.13 删除表 (2)出现【删除对象】窗口,窗口中显示出要删除的对象,单击【确定】按钮,完成对表的删除。
创建表 修改表 A B 重命名表 删除表 D C 第三节 使用T-SQL管理表 用户可以使用图形化工具Management Studio管理表,也可以使用T-SQL语言方便快速地管理表。
(一) 创建表 下面列出了创建表的T-SQL语法,其中包含了表的定义。列的约束和索引会在后面的内容中讲解。 | 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 ) } 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 ]
创建表 • 下面对部分参数进行说明,其他参数请读者参考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数据。
创建表 • 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)。
创建表例题 例5-1:使用T-SQL语句创建test表。 USE Student GO CREATE 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语句创建表
(二) 修改表 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 } } [ ; ]
修改表 • 下面对部分参数进行说明,其他参数请读者参考SQL Server的联机丛书。 • database_name • 要在其中创建表的数据库的名称。 • table_name • 要更改的表的名称。如果表不在当前数据库中,或者不包含在当前用户所拥有的架构中,则必须显式指定数据库和架构。 • ALTER COLUMN • 指定要更改命名列。
修改表例题 例5-2:建立一个表“tabletest”,有两个字段column1,column2,column1的类型为整形,column2的类型为varchar(20),不允许为空,然后再删除表中的column2字段。 CREATE TABLE tabletest ( column1 INT, column2 VARCHAR(20) NULL) ; GO ALTER TABLE tabletest DROP COLUMN column2 ; GO 执行第一个CREATE TABLE语句后如图5.15所示,执行ALTER TABLE语句后如图5.16所示。 图5.15 创建表“tabletest” 图5.16 修改表
(三) 重命名表 重命名表,要用到系统存储过程sp_rename。具体的语法这里不作讲解,下面仅以示例来说明使用sp_rename前后数据表名称的变化。 在查询分析器中输入: Use student Go Exec sp_rename ‘tabletest’,’newtable-test’ 输入前后数据表名的变化如图5.17,5.18所示。 图5.17 修改前 图5.18 修改后
(四) 删除表 要删除上一节建立的“newtable-test”表,可以在查询分析器窗口中输入以下T-SQL语句: USE Student Go DROP TABLE [newtable-test]
第四节 实现SQL Server 2005的数据完整性 数据完整性介绍 列约束和默认值 主键与外键
(一) 数据完整性介绍 • 所谓数据完整性就是指数据库中数据的正确性和一致性,是指数据的精确性(Accuracy) 和可靠性(Reliability),它是应防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。利用数据的完整性约束,可以保证数据库中数据的质量。因此,在进行表的设计时,一定要注意到对数据完整性的设计。 • 在SQL Server 2005 中,一般有以下四类完整性: • 域完整性:对具体一列上的数据的有效性限制。域完整性指特定列的项的有效性。可以强制域完整性限制类型(通过使用数据类型)、限制格式(通过使用CHECK 约束和规则)或限制可能值的范围(通过使用FOREIGN KEY 约束、CHECK 约束、DEFAULT 定义、NOT NULL 定义和规则)。 • 实体完整性:保证表中所有的行都是惟一的,以确保所有的记录都是可以区分的。实体完整性将行定义为特定表的唯一实体。实体完整性通过UNIQUE 索引、UNIQUE 约束或PRIMARY KEY 约束,强制表的标识符列或主键的完整性。 • 引用完整性:这是对涉及两个或两个以上表的数据的一致性维护。输入或删除行时,引用完整性保留表之间定义的关系。在SQL Server 2005 中,引用完整性通过FOREIGN KEY 和CHECK 约束,以外键与主键之间或外键与唯一键之间的关系为基础。引用完整性确保键值在所有表中一致。这类一致性要求不引用不存在的值,如果一个键值发生更改,则整个数据库中,对该键值的所有引用要进行一致的更改。 • 用户定义完整性:用户定义完整性可以定义不属于其他任何完整性类别的特定业务规则。所有完整性类别都支持用户定义完整性。这包括CREATE TABLE 中所有列级约束和表级约束、存储过程以及触发器。
(二) 主键与外键 • 在前面创建表的时候,曾提到过主键和外键。下面继续对主键和外键进行详细的描述。 • 主键:保证数据唯一且非空(not null),表的记录必须得有唯一区分的字段,主键主要是用于其他表的外键关联,本记录的修改与删除,当表没有主键时,这些操作会变的非常麻烦。一个表只能有一个主键。 • 外键:引用完整性表示得到正常维护的表之间的关系。表中的数据只应指向另一个表中的现有行,不应指向不存在的行。 • 例如,Classes表和Teachers表之间的关系。每个班对应了一个班主任,而在班级信息数据表中只有班级班主任的代码。要查询到班级班主任的姓名,必须要对下面两个表建立关系。也就是说一个班主任可以对应多个班级,而一个班级只能对应一个班主任。若要查询某班的班主任,必须要将班级信息数据表的Class_teacherid设置为外键,用于连接教师信息数据表的主键Teacher_id。
主键与外键 表5-2 班级信息数据表(Classes) 表5-3 教师信息数据表(Teachers)
(三) 列约束和默认值 • 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约束标识并强制实施表之间的关系。
列约束和默认值 约束可以是列约束,也可以是表约束。列约束指定为列定义的一部分,并且只应用于该列。前面的示例中的约束是列约束。表约束的声明与列定义无关,可以应用于表中多个列。当一个约束中必须包含多个列时,必须使用表约束。 例如,如果一个表的主键有两个或两个以上的列,则必须使用表约束将这些列包含在主键内。假设有一个记录工厂内的一台计算机上所发生的事件的表,假设可以同时发生几类事件,但不能同时发生两个属于同一类型的事件。可以通过在表的两列主键中同时包含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) )
列约束和默认值 2. 默认值 如果插入行时没有为列指定值,默认值则指定列中使用什么值。默认值可以是计算结果为常量的任何值,例如常量、内置函数或数学表达式。 若要应用默认值,可以通过在CREATE TABLE中使用DEFAULT关键字来创建默认值定义。这将为每一列分配一个常量表达式作为默认值。
第五节 查看表属性 表是组成数据库的基本元素,不管是在数据库的管理维护中,还是在数据库使用中,都需要去了解表的基本属性。可以通过Management Studio查看表属性,其步骤如下: (1)在【对象资源管理器】窗口中,选择要查看表属性的数据库【Student】,在【表】节点上单击鼠标左键,显示数据库中的表,在要查看属性的表上单击鼠标右键,弹出快捷菜单,如图5.19所示,选择【属性(R)】命令。 图5.19 查看表属性
查看表属性 (2)出现如图5.20所示的【表属性】窗口。用户可以查看表的一些基本属性,但是不能够修改。表属性页中包含了常规属性、权限设置和扩展属性。 图5.20 表属性页
查看表属性 (3)如果要为表添加权限,可以选择【选择页】中的权限,如图5.21。 图5.21 【选择页】中的权限
查看表属性 (4)如果要添加一个用户访问表的权限,鼠标点击图中的【添加】按钮,弹出如图5.22所示的【选择用户或角色】页面,点击图中【浏览】按钮,选择需要添加的用户名称,这里使用public用户。完成用户添加。 图5.22 【选择用户或角色】页面
查看表属性 (5)点击【确定】按钮,用户public的权限将在图中的显示权限位置显示,如图5.23。在这里可以设置用户对数据库的操作权限。 图5.23 设置表权限
第六节 实训:表的使用和管理 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字段删除。
实训:表的使用和管理 具体步骤如下: ① 打开Management Studio,点击按钮,出现新的查询录入窗口,如图5.24所示。 图5.24 新建查询
实训:表的使用和管理 ② 在窗口中输入以下语句创建表: USE Student GO 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 PRIMARY USE Student GO ALTER TABLE Classes WITH CHECK ADD CONSTRAINT FK_Class_department FOREIGN KEY(Class_department) REFERENCES Departments (Department_id) GO ALTER TABLE Classes WITH CHECK ADD CONSTRAINT FK_Class_Teacher FOREIGN KEY(Class_teacherid) REFERENCES Teachers (Teacher_id) GO
实训:表的使用和管理 运行以后界面如图5.25所示: 图5.25 新建的classes表
实训:表的使用和管理 ③ 然后输入以下语句,删除Memo字段。运行后,Memo字段被删除。 USE Student GO ALTER TABLE Classes DROP COLUMN Memo 运行结果如图5.26所示。 图5.26 删除Memo字段