表的创建
6-1 查看数据的内容
6-2 数据类型
6-3 创建表
6-4 表索引的管理
6-5 创建关联
6-6 数据输入
创建好数据库之后,接下来必须决定要在数据库内存放哪些信息,并且将这些信息加以整理规划,创建成一个或多个表。本章我们将介绍如何创建表,以及一些相关的设置。
6-1 查看数据的内容
在开始介绍表的创建之前,让我们先了解一下表的结构,查看表中的数据内容。在Enterprise Manager中可以利用打开表功能查看整个表中包含的数据,打开表属性窗口视图的结构及相关信息。
6-1-1 使用“打开表”功能查看数据内容
如果想要知道某表内所包含的信息内容,可以利用该表快捷菜单中的“打开表”命令来达成。在“打开表”菜单项中包含三个选项,选择“返回所有行”命令会完整地显示整个表的内容;选择“返回首行”命令,可以自行指定要显示的数据条数;选择“查询”命令则可以设置条件,筛选出符合条件的数据。
例如,假若我们想要看整个表的内容,可以在该表上按鼠标右键,在打开的快捷菜单中选择“打开表”|“返回所有行”命令,这时它就会打开一个表窗口,显示该表内包含的所有记录。
图6-2为执行打开范例数据库pubs中的sales表所显示的画面,我们可以发现表就像是一个二维的表格一样,它是由多条具有相同数据结构的记录所构成的。表格中的每一行代表一条唯一的记录,而每一条记录都是由stor_id,order_num,order_date等信息项目所构成的(这些信息又称为数据列或字段)。
6-1-2 查看表属性
在表子目录下选取要查看的表后,按下工具栏上的
由下图的“表属性”对话框中,可以发现,定义表就等于是在定义表内所要包含的信息项目(列),定义每一个列的属性与规则,包含列的名称、数据类型、长度大小、是否允许NULL等。其中,数据类型的设置与列允许的数据内容有关,在设置时应根据该列的数据特性、可能会包含的内容来决定。
6-2 数据类型
在Microsoft SQL Server中,每一个列、局部变量、表达式以及参数等都具有其特定的数据类型(如integer,character,money等),用来指定该对象可以存放的数据类型,以及决定数据所占用的空间。SQL Server 2000定义了许多的数据类型,用户可以根据数据的特性选择一种最适合的数据类型。例如,要存放文字的列,必须设置为文本类型的数据类型;要存放数字数据作数值运算的列,应该设置为数值类型的数据类型。SQL Server 2000系统支持的数据类型说明如下。
6-2-1 数值数据
数值数据可以用来做数值运算处理,当我们要存放纯数字的数据,或是要对存放的内容作数值运算时,可以将它定义成数值的数据类型。SQL Server 2000提供许多可以存放数值数据的数据类型,如Int,Decimal,Real等。这些数值数据类型的特性及数值范围说明如表6-1所示。
表6-1 数据类型的特性及取值范围
|
数据类型 |
使用字节 |
数据范围 |
整数数值 |
tinyint |
1 Bytes |
0 ~ 255 |
smallint |
2 Bytes |
-32,768 ~ 32,767 | |
int |
4 Bytes |
-231 ~ (231-1) | |
bigint |
8 Bytes |
-263 ~ (263-1) | |
小数数值 |
decimal (numeric) |
最大至38 Bytes |
(-1038 +1)~(1038-1) |
浮点数值 |
float |
单精度:4 Bytes; 双精度:8 Bytes |
-1.79E + 308 ~ 1.79E + 308 |
real |
4 Bytes |
-3.40E + 38 ~ 3.40E + 38 |
从表6-1中可以发现float浮点数据类型可分为单精度与双精度两种,一般来说,除非是在进行科学运算需要较精确的值,需要用到双精度,否则一般使用单精度就足够了。另外,使用浮点数据类型可能会产生部分位数数据遗失的问题,例如,单精度数据类型,当数值位数超过7位时,只会保留最前面的7位数字(数值123456789保存成单精度后会变成123456700);双精度数据类型只会保留15位数字。
当我们要指定数值数据的数据类型时,可以先通过存放的数值数据是否包含小数来决定使用整数类型的数据类型,或是带有小数的数据类型,接着再根据数值范围选择一个最适当的数据类型。
例如,年龄数据是一个数值数据,它通常是以正整数来表示,而且它的数值范围通常不会超过255,为了节省空间我们可以将它定义成tinyint数据类型;平均成绩数据为0~100之间的数值,通常保留两位小数,可以将它定义为 5 Bytes的Decimal数据类型(1~9位数),或是单精度浮点数据类型float或real。
6-2-2 货币数据
货币数据是专门针对金额数据而定义的,它可以说是一种特殊的小数数值数据,固定为4位小数。在SQL Server中提供两种货币数据类型:money与smallmoney,这两种货币数据类型的特性说明如表6-2所示。
表6-2 两种货币数据类型的说明
数据类型 |
使用字节 |
数据范围 |
Money |
4 Bytes |
263~(263 – 1) |
smallmoney |
8 Bytes |
-214.748,3648~+214,748.364 |
6-2-3 日期数据
日期数据是用来表示日期与时间,当我们要在表中存放日期时间信息,如出生日期、数据传入系统的时间等,就可以将列定义为日期时间数据类型。在SQL Server中,根据占用的字节以及数据的精度,定义了两种日期时间数据类型——datetime与smalldatetime,它们的特性说明如表6-3所示。
表6-3 两种日期时间数据类型说明
数据类型 |
使用字节 |
数据范围 |
精度 |
Datetime |
4 Bytes |
1753年1月1日 到 9999年12月31日 |
三百分之一秒 |
续表
数据类型 |
使用字节 |
数据范围 |
精度 |
smalldatetime |
8 Bytes |
1900年1月1日 到 2079年6月6日 |
一分钟 |
其实这种日期时间数据在系统中是以数值数据的形式存在的,数值整数的部分是用来指定该日期距离基准日的天数。例如,系统的基准日为1900/1/1,数值30,表示从1900/1/1算起的第30天,也就是1900/1/30;小数部分则是用来表示时间,例如,数值0.5表示半天,也就是12:00。所以日期时间数值30.5就是指1900年1月30日的上午12:00。
6-2-4 字符串数据
前面介绍的数值数据类型(含货币数据)只能允许输入数字,而字符串数据内则可以包含文字、数字或其他的特殊符号,几乎所有可以在计算机上输入的信息都可以视为是字符串数据。在定义字符串数据类型时,必须指定一个数值,用来表示字符串数据的字符长度。在char,varchar与text等字符串类型中,不论是字母、数字或中文字,每一个字符都占用一个字节空间。
1. char数据类型
char数据类型是用来存放固定长度的字符串内容,其最大长度可达8,000个字符(8K)。当我们要保存长度固定的数据(如代号)时,可以将它定义为char数据类型。
当我们在char数据类型内存入长度小于指定大小的字符串时,它将会自动在字符串后面补空格填满整个长度,使数据长度固定。
2. varchar数据类型
varchar数据类型较char数据类型有弹性,它可以随着存放的数据长度大小自动调整其占用的数据空间,当存入的数据长度小于指定的大小时,它不会在数据后面补空格,而是以实际存入的数据长度保存。其最大长度可设置为8,000个字符。
当数据内容长度的变异性较大时,varchar数据类型将是较好的选择,它可以减少不必要的空间浪费。例如,在产品数据的产品简述上,有些产品可能需要使用200到300个字来描述,有些产品则只需要短短20到30个字就可以介绍完,这时若将它定义为char数据类型,每一个产品的产品简述都固定占用200到300个字符长度;如果定义为varchar,则是占用实际输入的简述内容的字符长度。
3. text数据类型
char与varchar数据类型最大只能定义到存放8000个字符(8K),如果要存放的数据长度超过这个限制时,可以使用text数据类型。text数据类型和varchar数据类型一样,都是一个可变长度的数据类型,它允许的最大长度限制为231-1(2,147,483,647)个字符。
6-2-5 Unicode数据
前面介绍的三种字符串类型是使用数据库的字符集来定义字符串的内容,当要将这些数据转移到其他使用不同字符集的数据库时,数据的转换可能会发生错误,产生乱码。为了使数据能够在不同数据库(字符集)间顺利地转移,可以使用Unicode标准字符形式来定义字符串数据,所有的字符集的字符都有对应于这个标准的定义。
Unicode字符串类型包含nchar,nvarchar与ntext三种数据类型,分别对应前面的char,varchar与text数据类型。不过,这种Unicode标准是以2个字节代表一个字符,因此它可以允许的数据长度将会是非Unicode字符串类型的一半,也就是最大长度4,000个字符。如果预计要保存的数据长度将会大于4,000个字符,就必须将数据类型定义为ntext。
6-2-6 Binary数据
Binary数据是以十六进制的方式来表示数据,它可以接受1~9的数字,与A~F间的字母。通常我们可以利用它来表示图片或影像数据,或者是存放特殊格式化的文件数据,如Word,Excel,PDF文件等。
SQL Server提供binary,varbinary以及image等三种存放Binary数据的数据类型,其中binary数据类型为一固定长度的数据类型,它会以固定的长度处理数据,当数据长度不足时会自动填补到指定的固定长度。varchar与image数据类型则是可变长度的数据类型,会随着数据内容调整长度。一般来说,使用varchar数据类型应该已经足够,如果预期数据长度将会超过8KB,就要改用image数据类型。
表6-4
数据类型 |
长度变动 |
数据最大长度限制 |
binary |
固定长度 |
8,000个字节 |
barbinary |
可变长度 |
8,000个字节 |
image |
可变长度 |
231 – 1 (2,147,483,647)个字节 |
6-2-7 其他特殊数据类型
前面介绍的几个数据类型,其定义内容非常明确,如要保存日期、时间数据就使用日期时间数据类型、要存放文字就使用字符串数据类型、要存放数值就使用数值类型的数据类型等。除了这些数据类型外,SQL Server还提供了一些无法分类的特殊数据类型,将常用到的数据类型说明如下。
1. bit数据类型
bit数据类型就好像我们在程序语言中常用的Boolean布尔数据类型一样,如果数据内容只有True或False,1或0两个值时,可以将它定义为bit数据类型。例如,在产品数据中,可以利用它来表示该货品是否为新上市;在人员基本数据中,可以利用它来表示人员性别为男生或女生等。
实际上bit数据类型是以一个bit的位空间来存放数据,它的内容只有可能是0或1两种,我们必须自行定义0代表什么、1代表什么,例如,在“新上市”列中,可以定义数值为1时表示True(该货品为新上市),数值为0表示False(货品非新上市)。
2. timestamp数据类型
timestamp数据类型是一个binary的递增数据类型,它会在数据行加入或更改时自动产生,产生的值在数据库中是唯一的,不会有重复,通常我们可以使用它来作为列的版本戳记。由于这个时间戳记会随着数据行的变动而更改,因此最好不要将它设置为表的索引键,而且在一个表中也应该只会有一个timestamp数据类型的列。
timestamp列的内容是根据@@DBTS函数所取得的目前数据库时间戳记数值而更新的,与数据行插入或更改的日期与时间没有直接的关系。如果用户想要自动记录表中数据修改的时间,应该要使用datetime或smalldatetime数据类型,并利用事件触发程序来写入日期时间数据。
3. uniqueidentifier数据类型
uniqueidentifier数据类型是一个包含16字节的十六进制数字,用来表示全域唯一标识项(GUID)。这个GUID在不同的机器上、时间上都不同,因此对于一个跨国际、具有多台数据库服务器的企业,使用GUID作为辨识码来唯一标示数据行,可以确保所有这些数据库数据的汇整不会发生数据重复的问题。
在将列定义为uniqueidentifier数据类型时,必须将列的默认值设置为NEWID函数,这样当数据列插入到表时,就会调用NEWID函数自动产生GUID值。
4. sql_variant数据类型
sql_variant数据类型可保存text,ntext,timestamp与sql_variant以外的所有SQL Server支持的数据类型。当用户无法确定表的某个列内将会存放哪种类型的数据类型时,可以将它定义为sql_variant数据类型,允许它接受任何数据类型的数据,以避免在填入数据时产生数据类型不符的错误。
6-3 创 建 表
在规划好表的结构以及列使用的数据类型之后,接下来介绍如何将规划好的表创建起来。
6-3-1 表设计窗口
在Enterprise Manager管理工具中,可以利用“表设计”窗口来定义表的列属性与数据特性。“表设计”窗口的画面如下图所示,分为上下两个窗格,上面的窗格是用来定义表中每一个列的主要属性,如名称、数据类型、长度、是否允许NULL等;下方的窗格则可以针对选取的列,定义该列的其他数据属性,如默认值、精度、小数位数等。另外,在窗口上方的工具栏上还有一些工具按钮可以管理表的索引键、定义表间的关系。
1. 列主要属性
“列名”字段:用来唯一标识表内每一个列的名称,指定的名称绝对不能与表内的其他列名相同,也不能是Transact-SQL的保留字,而且在指定的名称内不能包含空格或其他的特殊符号。
“数据类型”字段:用来指定存放于该表内数据的数据类型,如果要存入的数据与指定的数据类型不符,将会产生类型不符的错误。可以根据要存放信息的数据特性,并根据前面介绍的数据类型说明,为列找到一个适合的数据类型。
“长度”字段:用来指定列的字节数,随着指定的数据类型的不同,这个长度字段所代表的含义也会有所不同。在字符串数据类型中,这个字段值就代表字符串的长度,这时可以修改这个字段值,调整适当的字符串长度来存放数据。对于数值数据类型来说,其所占的字节数是固定的,因此无法更改这个字段值。
“允许空”字段:用来设置是否允许这个列的内容为空,可以利用鼠标点取的方式选中或取消这个选项。当列被设置为允许为空值时,如果没有为这个列指定任何的数据,将会使用空作为默认值存放到列。反之,如果设置列不允许空,就必须自行为列指定默认值,否则在插入数据行时,若未指定任何数据给该列,将会发生错误。
2. 列的其他属性
这些列属性是个别设置到各个列上的,而且随着列定义的数据类型的不同,部分的属性项目可能无法设置。
“描述”字段:这个字段主要提供来作为列的批注说明,让管理者日后在维护时,可以更容易了解该列所存放的信息。可以在这个字段中,输入任何的字符串文字,当然也可以忽略不填。
“默认值”字段:这个字段是设置当插入数据行而未指定列数据时存入列内的默认值。根据设置的数据类型,这个值可以是文字、数字或是日期时间数据,也可以是一个函数。例如,在uniqueidentifier数据类型的列中,在这个默认值字段中指定函数NEWID,取得GUID值。
“精度”与“小数位数”字段:这两个字段只有在属于Decimal或Numeric小数数据类型的列中设置,它们分别用来指定整个数值数据的数值位数与小数位数,默认为(18,0),表示该列可以存放18位数的整数数据(因为小数字数为0)。在存放分数的列中,分数范围为0~100,且要保留两位小数位置,可以将“精度”字段设置为5,“小数位数”字段设置为2。
“标识”字段:用来设置是否要将列定义为标识列,自动产生列的内容。当我们将列设置为标识字段时,它会自动以“标识种子”字段的内容作为列的初始值,然后以每次增加“标识递增量”的方式,自动为新建的数据行指定该列内容。例如,在客户数据中,我们希望在新建客户数据时,自动产生客户编号,可以将“客户编号”列的“标识”属性设置为True,并将“标识值增量”定义为1,这样每一条加入的客户编号都会自动递增。只有在整数数据类型(如int,smallint,tinyint)或无小数字数的decimal或numeric数据类型,可以设置标识选项。
“是RowGuid”字段:这个字段只有在uniqueidentifier数据类型的列中才可以设置,若将它设为“是”,SQL会自动将NEWID函数加入到默认值字段中,使得每当数据加入到表时,列自动取得GUID值。
“公式”字段:当列的值与其他列的值有关联时,可以在公式字段上输入表达式,自动计算列的内容。例如,在产品销售订单中,可以由“单价”与“数量”取得“小计”信息,因此可以在“小计”列的“公式”字段上输入公式“(单价*数量)”,这样以后要加入数据时,只要输入单价及数量信息就可以自动计算得小计信息。
图6-8 使用公式字段自动计算列的值
“排序规则”字段:是用来设置列的字串数据比对、排序方式,可以直接使用默认的“<数据库默认值>”,沿用数据库的排序规则方式;或者是单击字段右方的
6-3-2 使用表设计窗口创建表
了解表设计窗口的设置项目后,接下来就直接以一个范例来说明如何使用表设计窗口来创建表,在这个范例中将会在“Trade”数据库中创建一个存放产品数据的“产品基本信息”表,表的列结构如表6-5所示。
表6-5 产品基本信息表
列名 |
数据类型 |
长度 |
|
NULL |
产品代号 |
varchar |
16 |
|
否 |
产品名称 |
varchar |
50 |
|
否 |
类别编号 |
varchar |
4 |
|
否 |
产品简述 |
varchar |
200 |
|
是 |
单价 |
decimal |
9 |
精度18,小数位数2 |
是 |
币别 |
Char |
2 |
|
是 |
交货期 |
char |
10 |
|
是 |
新上市 |
bit |
1 |
|
是 |
备注 |
varchar |
50 |
|
是 |
创建“产品基本信息”表的步骤如下:
(1)展开“Trade”数据库目录,并选取“表”目录,然后单击
(2)在上方表主要属性窗格的第一列中,输入第一列的信息,在“列名”字段中输入“产品代号”字样,在“数据类型”字段中选择“varchar”项,在“长度”字段中输入数值“16”,然后用鼠标取消“允许空”字段的选取,表示该列不能是空。
(3)重复步骤2的动作,依序定义所有列的属性,其中在第五个“单价”列上,必须在下方窗格的“精度”字段中输入数值“18”,在“小数位数”字段中输入数值“2”。
(4)表的所有列都定义完成后单击工具栏上的
完成上述四个步骤后,就已经初步完成了创建表“产本基本数据”的动作,这时可以直接按下窗口的关闭按钮,关闭设计表。回到控制台窗口后,可以在表的子目录中找到我们刚创建的表“产本基本信息”。
6-3-3 创建表主键
每一个表可以定义一个主键,这个主键可以是单一列,也可以是由多个列丛集而成,它主要是用来唯一标识每一个数据列,也就是说这个主键在表中具有唯一性,绝对不会有重复。
例如,上面创建的“产品基本信息”表中,每一项产品应该要有它自己的产品代号,我们可以由产品代号来标识唯一的产品数据,因此可以将这个“产品代号”数据行设置为“产品基本信息”表的主键。
接下来,就直接以“产品基本信息”表为例,来说明如何创建表的主键。
(1)首先在“表”子目录中找到要设置的表项目“产品基本信息”,按下鼠标右键,在打开的快捷菜单中选择“设计表”命令,打开它的“设计表”窗口。
(2)用鼠标在上方的窗格中选择要定义为主键的列,这里选择“产品代号”列,然后在工具栏上按下
(3)这时可以在列的前面看到钥匙图标标示,表示该列已经被定义为表的主键,最后再单击
如果表内需要由多个列从集成主键,可以单击在设计窗口中利用Ctrl或Shift键选取多个列,然后再单击
定义好主键之后,SQL Server就会自动维护主键的唯一性,不允许存在相同的值。不过,在定义主键时,必须注意不能将设置为允许空的列指定为表的主键。
6-3-4 使用CREATE TABLE指令创建表
除了可以使用表设计窗口创建表外,也可以使用Transact-SQL语法中的CREATE TABLE指令来创建表。完整的CREATE TABLE语法相当复杂,在这里将不详细描述它的细节,只针对常用的简单表设计作说明,让读者对这个指定有初步的认识。
常用的CREATE TABLE语法如下:
CREATE TABLE 表名
(
字段名 数据类型(长度) [其他字段属性],
.. ..
)
在CREATE TABLE后面接着是要创建的表名,然后在小括号内依序定义每一个列的名称、数据类型、长度等字段属性,而在不同的字段定义中使用逗号隔开。
例如,我们要在目前的数据库中创建一个名称为“币别信息”的表,用来存放货币信息,这个币别信息表的结构如图6-18所示,包含币别代号、币别名称与币别符号等三个字段,且以币别代号列作为其主键。
这时,可以在Query Analysis窗口中,执行下列的SQL语句来创建该表:
CREATE TABLE 币别信息
( 币别代号 char(2) PRIMARY KEY,
币别名称 varchar(10) ,
币别符号 varchar(6)
)
语句中的“PRIMARY KEY”是用来设置该列为主键,在这个关键词后可以加上CLUSTERED或NONCLUSTERED关键词,用来表示该索引键为丛集索引,或者非丛集索引,如果没有指定,默认为NONCLUSTERED非丛集索引。如果要为列指定默认值,可以在该列定义后面加上DEFAULT关键词并指定默认值。其他可用的列属性关键词说明如表6-6所示。
表6-6 列属性关键词说明
关 键 字 |
说 明 |
Null | Not Null |
设置该列是否允许空,默认为NOT Null表示该列不允许为空 |
DEFAULT 默认值 |
设置该列的默认值,指定的默认值参数可能是数值、字符串、日期时间数据,或者是函数名称 |
IDENTITY (种子,增量) |
设置该列为标识列,内容值会自动递增产生。在设置时必须指定起始值与每次增加的值,如果没有指定默认从数值1开始,每次增加1 |
续表
关 键 字 |
说 明 |
ROWGUIDCOL |
这个关键词对应于表设计窗口中的“为RowGuid”字段,在uniqueidentifier数据类型的列上加入这个关键词,将会自动使用NEWID作为其默认值,自动取得GUID |
COLLATE 排序规则名称 |
指定列使用的排序规则名称,如果没有使用,默认套用数据库的排序规则方式 |
6-4 表索引的管理
在表中可以为某些列制作索引,当我们要对该列执行数据查询操作时,它将会通过该列索引文件找到数据在表中的位置,并取得查询的结果。由于表的索引文件通常会比表本身小,所以通过索引搜寻数据的速度会比直接在表上查询的速度快,不过相对的创建索引文件会占用磁盘空间,且数据更新的速度可能会较慢。
为经常用来查询的列创建索引,可以加速数据的查询动作,这对于包含有大量数据的表而言非常重要。不过,必须注意的是,如果要同时对两个或两个以上的列进行数据查询的动作,必须将这些要同时查询的列创建成一个丛集索引,而不是分别对每一个列创建各自的索引。
6-4-1 表设计工具属性页
在Enterprsie Manager管理工具中,可以利用设计表窗口的“索引/键”功能来管理维护表的索引键及索引特性,执行这个“索引/键”功能会打开如6-19所示的属性窗口。
在“索引名”字段内指定索引的名称,用来唯一识别表的各个索引;下方的清单用来指定索引所涵盖的列,以及列的数据排列方式。例如,上图的“IX_产品类别”索引是使用表的“类别编号”列作为索引键,以“升序”的方式排列。如果要创建包含多个字段的索引,依序将涵盖的每个字段分列设置在列表中。
其他各个索引设置项目的意义说明如表6-7所示。
表6-7 各索引设置项目的意义
项 目 |
说 明 |
索引文件组 |
用来指示索引文件要存放到哪一个文件组 |
创建 UNIQUE |
用来指示是否要确保索引数据的唯一性,选取该选项可以选择创建唯一条件约束或是唯一索引,如果数据本身具有唯一性,但索引列组合与主键不同时,可以选择创建唯一索引;如果要确保某一个不属于主键的列不会有重复的数据,可以选择创建唯一条件约束 |
忽略重复键 |
当选择创建唯一索引时,可以利用这个复选框设置是否要忽略重复的索引键,如果选择忽略,则当新建数据重复时,只会将违反唯一性的数据忽略,其他的数据则可以顺利存入表中 |
填充因子 |
指示索引页容量的填满因子。当设置的值大于0时,可以使用下方的“填充索引”选项,使每个内部节点保持开放的空间。这个值的大小会影响执行的效率,通常在创建索引时不需要指定它,但当我们能精确地预测数据未来的变化情况时,这个选项将会很有用 |
续表
项 目 |
说 明 |
创建为CLUSTERED |
指示该索引为丛集索引或非丛集索引。丛集索引会对数据实际保存的位置做排序处理,当我们经常对列作数据范围查询时,使用丛集索引将会加快查询的速度,因为数据在附近 |
不自动重新计算统计 |
指示SQL Server使用先前创建的统计信息,而不重新计算。使用这个选项产生的结果可能不是最佳的,一般不建议使用 |
6-4-2 利用表设计工具属性创建索引
接下来,我们就直接以一个例子来说明使用属性窗口创建索引的步骤。假设在“产品基本信息”表中我们经常会利用产品类别编号来查询产品数据,可以为“产品基本信息”表中的“类别编号”列创建一个索引“IX_产品类别”。创建的步骤如下:
(1)首先打开“产品基本信息”的表设计窗口,然后按下工具栏上的
(2)单击“新建”按钮,这时会自动产生一个默认的索引设置,如图6-21所示。
(3)在“索引名”文本框中重新指定索引的名称“IX_产品类别”,在“列”字段中选择“类别编号”列,其他的设置使用默认值。
(4)设置完成后,单击“关闭”按钮,关闭属性窗口回到表设计窗口,并单击工具栏上的“保存”按钮,保存所有的设计更改,完成表索引的创建动作。
另外,如果需要经常同时就产品的价格与币别进行数据查询,也可以将这两个列创建成索引,列清单中依序选定“单价”与“币别”列,设置的画面如图6-23所示。
在使用这个属性窗口维护表的索引设置时必须要小心,因为在这个窗口上进行的所有变动,都会立即记录下来,变动无法取消复原,除非在回到表设计窗口中不执行保存的动作,取消所有的表设计更改。
6-4-3 使用向导创建索引
SQL 2000中提供了一个“创建索引向导”,可用来协助数据库管理者为表创建索引,在这里,将利用这个创建索引向导,利用“产品基本信息”表中的“产品名称”列创建一个索引“IX_产品名称”。
(1)在Enterprise Manager控制台的菜单中选择“工具”|“向导”命令,打开“选择向导”对话框,展开“数据库”目录,从中选取“创建索引向导”项目,然后单击“确定”按钮,激活创建索引向导。
(2)首先打开的是欢迎对话框,在这个对话框上会显示简述创建索引的步骤内容,单击“下一步”按钮,切换到下一个设置对话框。
(3)分别在“数据库名称”与“对象名”两个下拉列表中,选择要创建索引的数据库与表,在这里选择“Trade”数据库中的“产品基本信息”表。指定好之后,单击“下一步”按钮,切换到下一个设置画面。
(4)如果先前定义过其他的索引,这时它先打开一个对话框显示表目前所有的所索引设置,确定要创建的索引尚未定义后,单击“下一步”按钮。
(5)在图6-27的“选择列”中,会显示表的每一个列,在清单的包含于索引字段中选择要包含于索引中的列,在这里只要创建产品名称的索引,因此只要勾选“产品名称”列项目,单击“下一步”按钮切换设置画面,如图6-28所示。
(6)在“指定索引选项”中,可以定义该索引是否为聚焦索引、是否为唯一性索引,以及索引的填满因素。在这里,使用默认值,将填充因子设置为“最佳”,单击“下一步”按钮切换设置画面。
(7)在“完成”对话框中的“名称”文本框中输入要创建的索引名称,在这里输入“IX_产品名称”,然后单击“完成”按钮,这时它会开始根据我们前面步骤所设置的内容,创建表索引“IX_产品名称”,如图6-29所示,如图6-29所示。
6-4-4 利用“管理索引”窗口管理表索引
在Eneterprise Manager管理工具中提供了一个“管理索引”窗口,让管理者可以通过这个管理索引窗口来维护表的索引设置。要打开管理窗口可以在管理的表项目上按鼠标右键,然后在打开的快捷菜单中选择“所有任务”|“管理索引”命令,这时它就会打开如图6-30所示的“管理索引”对话框。
在这个对话框中,可以利用下方的“新建”、“编辑”及“删除”按钮来管理维护表的索引,创建新的索引、修改现有索引的设置,或是删除现有的表索引。
当单击“新建”按钮时,会打开如图6-31所示的“新建索引”设置画面,在“索引名称”文本框中为要创建的索引指定一个名称,在列清单中勾选要包含索引中的列,并在“排序次序”字段中指定列的排序方式,然后再设置下方的索引选项,有关这些选项所代表的意义,请参考前面的介绍。
单击“编辑”按钮,会打开一个“编辑现有索引”窗口,如图6-32所示,这个窗口的设置画面与“新建索引”窗口画面相同,只不过它会自动加载选取索引的设置,且其“索引名称”值不能更改。例如,下图为选取“IX_产品价格”索引时,单击“编辑”按钮所打开的“编辑现有索引”窗口画面。
6-5 创建关联
在SQL Server中可以通过创建Primary Key(主键)与Foreign Key(外键),为不同的表间创建关系,以维持表间的密切关系,以及数据的完整性与一致性。
在Eneterprsie Manager中,可以利用数据设计窗口的“管理关系”功能来维护表间的关系设置,执行这个“管理关系”功能所打开的关系设置画面如图6-33所示。窗口中的“新建”与“删除”按钮,可以用来创建一个新的关系,或是删除现有的关系设置。
“关系名”字段是用来指示该关系的名称,当我们单击“新建”按钮要创建新的关系时,它会自动产生一个关系名。“主键表”是指定被参照的表,下方的列清单则是指定被参照的列;“外键表”是用来指定参照来源的表,下方的列清单则是指定参照来源的列。
例如,前面创建的“产品基本信息”与“币别信息”两个表,我们希望利用这两个表中币别代号做关系,以便“产品基本信息”表可以通过“币别”列,参照“币别信息”表中的“币别代号”列,取得币别信息。这时,可以将“币别信息”表设置为主键表,“产品基本信息”为外键表。
窗口下方的关系属性选项主要是用来指示如何维护数据的关系与一致性。例如,选择“创建中检查现存数据”复选框,将会在创建这个关系时检查数据对应参照是否完整,外键是否都能对应到主键。其他的关系属性选项说明如表6-8所示。
表6-8 其他关系属性选项说明
项 目 |
说 明 |
创建中检查现存数据 |
将关联性新建到外键表中时,会将条件约束套用到存在于数据库中的现有数据上 |
续表
项 目 |
说 明 |
|
对复制强制关系 |
在将外键表复制到不同的数据库时,套用条件约束 |
|
对INSERT和UPDATE强制关系 |
将条件约束套用到在外键表中插入、删除或更新的数据上,如果外键表中有符合的数据列,也会防止删除主键表中的数据列 | |
级联更新相关的字段 |
每当主键值更新时,指示DBMS自动更新此关联性中的外键值 | |
级联删除相关的字段 |
每当删除主键表中被参照的数据行时,指示DBMS自动删除外键表中的数据列 |
现在说明如何使用表设计窗口的“管理关系”功能,创建“产品基本信息”与“币别信息”表间的关系。
(1)打开“产品基本信息”的表设计窗口,然后按下工具栏上的
(2)单击窗口上的“新建”按钮,这时它会自动创建一个使用默认设置的关系,可以在这个关系上修改其设置,如图6-35所示。
(3)在“主键表”上选择表“币别信息”,在下方的列清单上选择列“币别代号”;在“外键表”上选择表“产品基本信息”,在下方的列清单上选择列“币别”,表示要使用这两个索引键创建表关系,如图6-36所示。
(4)在下方的关系属性选项中选择“创建中检查现存数据”、“对复制强制关系”以及“对INSERT和UPDATE强制关系”三个复选框,随时检查维护数据的完整性。
(5)设置完成后单击“关闭”按钮,将画面切换回表设计窗口,然后在设计窗口上单击“保存”按钮,保存所有的设计更改,完成关系的创建。
6-6 数据输入
至此,有关表的建置动作已经介绍完毕。不过,在结束本章前,再介绍在表中增加记录的方法。常见的输入记录的方法有:
· 直接在表窗口中输入
· 使用数据导入/导出向导
· 使用INSERT INTO指令
6-6-1 在表窗口中输入数据
这是在表中输入数据最简单而直接的方法,只要打开要输入数据的表窗口(在表的快捷菜单中选择“打开表“|“返回所有行”命令),然后就可以直接在这个表窗口中看到所有已存在的记录。要新建数据,只要在空白列处输入每一个列内容就可以了。
例如,图6-37是在打开的“币别信息”表中输入美元数据的画面,数据行前方的
6-6-2 导入数据
使用上面直接输入数据的方法虽然方便,但是当要填入大量的数据,或者要填入的数据已经存在于其他的表或者是以其他的文件形式存在时,使用直接输入的方式可能会需要花费很多时间,这时不妨改用导入数据功能,将现有的数据文件中的数据加载到表中。
假设我们已经有一个保存产品基本信息的文字文件,可以利用下面的导入数据操作,将文本文件内的数据加到“产品基本信息”表中。其步骤如下:
(1)在表上按鼠标右键,在打开的快捷菜单中选择“所有任务”|“导入数据”命令,激活导入/导出向导。
(2)选择要加载的数据源:在“数据源”下拉列表中选择“文本文件”,然后在“文件名”文本框中输入文件所在的路径位置,图6-39所示是要从“C:\TEMP\产品基本信息.TXT”文件加载数据。
(3)指定文件格式:在这要根据来源文件的格式进行选择,可以由下方的文件预览区中检查文件的内容,指定最合适的格式设置。在这个来源文件中它是以逗号分隔每一个数据域位,且第一行为列的名称,因此在这里选择“带分隔符”选项,并选中“第一列含有列名”复选框。
(4)选择分隔符:在这里选择“逗号”单选按钮,这时可以由下方的预览窗格检查数据的内容。通常会在这一个窗口与上一个选择文件格式窗口进行切换,定义出最合适的数据格式设置。
(5)选择数据加载的目的位置:在这里选择将它加载到“Trade”数据库内。
(6)显示数据源与目的位置的对应关系:可以选中或取消选中前面的复选框,指示要进行数据导入的项目。
(7)另外,也可以在上面的窗口中,单击“转换”字段上的
(8)保存、调度和复制包:在这个窗口中可以选择设置的数据导入动作要现在立刻执行或者是要稍后再执行,以及是否要保存这个加载设置。如图6-45所示,在这里,选择“立即运行”复选框,且不保存设置。如果经常地要重复使用这个数据导入动作,可以将它的设置保存起来,这样日后只要执行保存的封包即可,而不用再一次地重新设置。
(9)在完成窗口中,单击“完成”按钮,它就会打开先前的设置内容,将来源数据“C:\TEMP\产品基本信息.TXT”内的数据导入到“Trade”数据库中的“产品基本信息”表中。
6-6-3 使用INSERT INTO语句
Transact-SQL语法中提供INSERT INTO语句,用来在表中添加记录,INSERT INTO语句的语法如下:
INSERT INTO 表名(列 [,列] )
VALUES (内容值 [,内容值] )
在INSERT INTO关键词后,指定要加入记录的表名,在小括号内以逗号分隔不同的列名,没有出现在小括号内的列将会存入默认值或NULL。在VALUES关键词后依序指定要存入列内的内容值。
例如,要在“币别信息”表中加入港币信息(代号为“03”、符号为“UK$”),可以执行下面的INSERT INTO语句:
INSERT INTO 币别信息(币别代号,币别名称,币别符号)
VALUES(“03”, “港币”, “UK$”)
如果需要添加的记录已经存在于其他表中,则也可以利用如下的INSERT INTO语句,从其他的表中取得要添加的记录。这个INSERT INTO语句的语法与上面的语法最大的不同点,在于它使用子SELECT语句来指定要添加表内的记录。
INSERT INTO 表名(列 [,列] )
SELECT 列 [,列]
FROM 来源表
例如,要将“新产品类别”表中的数据加入到“产品类别”表中,可以执行下列的INSERT INTO语句:
INSERT INTO 产品类别(类别编号,类别名称)
SELECT 类别编号,类别名称
FROM 新产品类别
有关SELECT语句的语法,将在下一章中详细介绍。