10. 建立数据库数据表
基础工作的部署
数据表基本观念
在档案群组中建立数据表
使用 Null 值
增加IDENTITY属性
利用 Enterprise Manager 建立数据表
本章总结
当数据库建立完成(数据库包括档案和档案群组),下一步就是建立数据表对象来保存数据。建立数据表是一个复杂的过程,本章会介绍建立数据表所需的考虑。我们首先会介绍建立数据表的基本要求,研究其中项目,最后是范例介绍。
本章将介绍使用者数据型别与使用者自订数据的型态,以及如何在档案群组中储存数据表、Null 值以及 IDENTITY 属性。您也会学到如何利用 Enterprise Manager 和 Transact-SQL(T-SQL)来建立数据表,以及建立数据表的限制、数据表的默认值和索引。
________________________________________
注意
在建立数据表前,一定要先熟悉上述所提到的各项数据及元素。
________________________________________
基础工作的部署
开始设计数据表前,必须对资料表作一些架构上的决定,这些决定可以让您对整个数据表有一个概廓,在概廓之下逐一设计每一个数据表,以下列出哪些是您该考虑到的决定:
• 数据表会包含什么数据?
• 要建立哪些数据行储存数据?这些资料行的名称为何?
• 数据行的数据范围和型态该如何设定?
• 资料行是否能包含 Null 值?能否使用默认值?(使用 Null 值会比用默认值多一些步骤)。
• 哪些数据行该设成主索引键,哪些该设成外部索引键?
• 该指派给资料表哪些条件约束?
• 该利用哪一类型的索引(丛集或非丛集)?哪些数据行需要设定哪一类型的索引?
• 使用者对数据表的存取权限
在建立数据库前,尽可能多面性的考虑设计上的问题。可以在纸上草拟出整个数据表的结构,仿真使用者存取数据的模式,如哪些数据表应设成只读,哪些数据表可能插入、删除或新增数据;哪些数据常被查询、哪数据行常被搜寻等,以决定数据是否该储存。了解数据表的结构便可决定如何建立数据表、索引、限定数据行数据及默认值等。下面会由基础开始学习建立数据表。
数据表基本观念
在这一节中,我们会复习一些简单但重要的观念。透过范例介绍基本要素,学习系统数据型别,及如何建立及删除使用者自订的数据型别。
定义数据表
数据表 (Table)是数据库对象,其中包含数据库内所有的数据,透过数据列和数据行的组合来储存数据。数据表由数据行定义,数据可以以类似电子数据表的格式分类,如表10-1所示,表10-1是一个名为 Product_Info 的范例数据库数据表。在范例中我们会将这个数据表建立在 MyDB 的数据库内(沿用 第九章 的数据库)。
Product_Info 数据表用来储存商店内每一项商品的数据。当商品上了货架,数据表就会增加一笔新的数据列。这个数据表有三列五栏的数据,数据行的名称分别为 Product_ID、Product_Name、Description、Price 及 Brand_ID。我们也可以用 T-SQL 指令来建立数据表(不需实际输入数据),在本章后面 〈选择正确的数据型别〉 章节部分将会介绍。(本书 第二十章 会教导如何使用 INSERT 指令插入数据至数据表)。
表10-1 Product_Info 资料表
Product_ID Product_Name Description Price Brand_ID
1 帐蓬 两人用 80 12
2 瓦斯炉 使用天然瓦斯 20 33
3 登山包 耐用 60 15
定义数据行属性是建立数据表很重要的一环。譬如定义数据行数据型别(data type)是否该限定该数据行的数据范围(如字符长度等),SQL Server提供数种数据型别供使用者选择,或是使用者自订数据型别(您只能新增数据型别,不能改变系统已存在的数据型别)。
使用系统数据型别
数据表的数据型别可以设成以下几种属性:
• 该数据行所能包含的数据种类,如字符(character)、整数(integer)或图像(image)
• 数据行中数据的大小或长度
• 有效位数(针对数值数据型别的设定),也就是数据行中数字数据所能包含的位数
• 小数字数(针对数值数据型别的设定),小数点右边能接受的位数范围
数据型别也会影响检视的数据行、预存程序的参数、变量和传回一个或多个数据值的 T-SQL 函数。表10-2列出 SQL Server 提供的内建数据型别。SQL Server 2000 引进了三种新的资料型别- bigint 、 sql_variant 和 table 。(除了数据表中标明的特殊情况外,所有对象都使用相同的基本数据型别)。
表10-2 Server 2000系统数据型别
资料型别 说明 储存大小
bigint 8个字节的整数(完整数字) 8个字节
binary[(n)] n个字节固定长度的二进制数据。n必须在1到8000之间。当数据行中数据项大小一致时,就应该使用binary。 n + 4个字节
bit 整数资料,其值为1、0或 Null。在bit数据行上不能建立索引。 对于数据表中的8位数据行用1个字节空间;对于9到16位的数据行则用2个字节空间,以此类推
char[(n)] 固定长度的非 Unicode 字符数据, n个字节
n的值必须为最1-8000。
cursor 数据指针的参考,仅用于变量和预存程序参数。
datetime 日期与时间数据,从1753年1月1日到9999年12月31日,精确度为三百分之一秒 8个字节
decimal[(p,[s])]
or numeric[(p,[s])] 固定有效位数及小数字数的数字
(numeric 在功能上等于decimal)。精确度(p)指定储存位数的最大值(包括小数点的左右两边)。小数字数(s)指定小数点右边储存位数的最大值。小数位数应小于或等于有效位数。有效位数的最小值是1 5到17个字节,取决于有效位数
,最大值是28,若 SQL Server 以 -p参数启动,最大值则可达38。
float[(n)] 浮点位数的数字数据,从-1.79E+ 308 到1.79E + 308。n是浮点数字的小数字数,范围从1-53。 4到8个字节,取决于精确度
image 可变长度的二进制数据,最大长度为2^31 - 1(2,147,483,647)个字节。image 数据行的项目是指向image数据值储存位置的指针,此数据与实际数据表的数据是分开储存的。 指针可容许16个字节
integer or int 整数(完整数字)数据从-2^31(-2,147,483,648) 至2^31 - 1(2,147,483,647)。 4个字节
money 货币数据值从-2^63(-922,337, 203,685,477.5808) 到2^63 - 1(+922,337,203,685,477.5807),精确度到万分之一货币单位。 8个字节
nchar[(n)] 固定长度的 Unicode 字符数据,n的值从1到4000。每一个 Unicode字符使用2个字节储存,并支持国际字符。 2个字节乘以输入的字符数
ntext 可变长度的 Unicode 数据,最大长度为2^30 - 1(1,073,741,823)个字符。ntext 数据行项目是指向数据值位置的指针,此数据与实际数据表的数据是分开储存的。 指针可容许16个字节;以及输入数据的字符数乘以2个字节
nvarchar 可变长度的 Unicode 字符数据,最大长度为4000个字符。每一个Unicode 字符使用2个字节储存,并支持国际字符。 2个字节乘以输入的字符数
real 浮点位数的数字数据,从-3.40E+38到3.40E+38。Real的同义字是float(24)。 4个字节
smalldatetime 日期与时间数据,从1900年1月1日到2079年6 月6日(datetime资料型别较为精准) 4个字节
smallint 整数资料,从2^15(-32,768)到2^15 - 1(32,767)。 2个字节
smallmoney 货币数据值从-214.748,3648到+214,748.3647,精确度到千分之十货币单位。 4个字节
sql_variant 此数据型别可储存 text、ntext、timestamp 与sql_variant 以外的各种 SQL Server 支持的数据型别。sql_variant 可用于数据行、参数、变量、并传回使用者自订函数的值,sql_variant 允许这些数据库对象支持其它数据型别值。 储存大小不定
sysname 其为一个系统支持的使用者自订数据型别,sysname为 SQL Server 定义为nvarchar(128)以用来参考储存对象名称的数据行。 256个字节
table 就像使用暂存数据表一样-宣告时必须包含数据行清单和数据型别。可用来储存区域变量或使用者自订函数的传回值。 取决于数据表定义
text 可变长度的非 Unicode 数据,最大长度为2^31 - 1(2,147,483,647)个字符。其为指向数据值位置的指针,此数据与实际数据表的数据是分开储存的。 指针需要16个字节
timestamp 全数据库唯一的数字,每当一数据 8个字节
列更新时,此数字便随之更新。一
个数据表只能够有一个timestmap
字段
tinyint 整数资料,从0到255。 1个字节
uniqueidentifier 全域唯一识别项(GUID)。 16个字节
varbinary 可变长度的二进制数据,最大长度 输入数据的实际长度 +4
为8,000个字节。当资料行的资 个字节
料项目大小不一致时,可以使用
varbinary。
varchar[(n)] 可变长度的非 Unicode 数据,最大 实际输入数据的长度
长度为8,000个字符。
选择正确的数据型别
选择正确的数据型别是建立数据库重要的一环。数据行中所储存的数据值必须在允许范围之内,并拒绝储存数据型别不符的数据(譬如说数据行只允许输入数字值时,当输入字符值时就不能允许数据输入)。一旦指定了数据型别就可以避免上述的情况。下列两个问题可以帮助您决定该指定何种数据型别:
• 这个数据型别是否和将输入的数据吻合?
• 数据行该设为固定长度或可变长度?
选择合适的数据型别的过程十分直觉化,也就是数据行中所输入的数据只要符合该数据行指定的数据型别即可。因此,您要预测该数据行可能输入数据的范围,这个范围要可以涵盖未来数据值的范围,却又不浪费空间。 浪费空间 是指我们对一个数据行预留了数据值的范围,但范围设得太过宽松而浪费了预留下来的空间。举个例子,假设您需要一个数据行来储存从1到100的整数资料,当然您可以将数据行设定为 integer 数据型别,但是每一个整数就占用4个字节的空间。若是将数据行设为 tinyint 数据型别(0到255之间的值),就只占用1个字节的空间。因此这个数据行就建议设为 tinyint。
另一个要考虑的是数据行应使用固定长度,还是可变长度的数据型别。如果数据行中所有的值几乎都是相同大小,就建议使用固定长度。至于可变长度的数据型别则在当数据值的大小不固定,或是当数据本身不经常变更时适用。可变长度的数据型别包括 varchar、nvarchar、varbinary、text、ntext 和 image。弹性的运用可变长度数据型别可明显地节省储存空间。如果您将数据行依最长的数据值定义成固定长度,那么数据行中较短的数据值也会占据同样大小的储存空间,这样还不如设为可变长度以节省空间。那为什么我们不把所有数据行都设成可变长度呢?其实是因为系统要花较长的时间处理可变长度的数据行。所以,如果能确定数据值的长度是固定的,还是把数据行设为固定长度。
利用系统数据型别建立 Product_Info 数据表
在开始之前,先看看 T-SQL 的 CREAT TABLE 命令(用以建立如表10-1的Product_Info 数据表)。在这个范例中只会使用系统数据提供的数据型别与固定长度数据列。
当使用 T-SQL 命令来建立数据表时,数据表即建立在使用中的数据库上。欲使用某一个数据库,请依下面语法使用 USE database_name 命令。在这个范例中,我们的数据库取名为 MyDB 。关键词 GO 指示现在应该执行所有在该列前面的命令。(请参阅 第13章 使用T-SQL详细的内容。)
USE MyDB
GO
CREATE TABLE Product_Info
(
Product_ID smallint,
Product_Name char(20),
Description char(30),
Price smallmoney,
Brand_ID smallint
)
GO
在输入 CREATE TABLE 命令之后,将数据表名称指定为 Product_Info。在括号中间,在数据行名称后即定义各数据行的数据型别。两个char 数据型别的长度各设定为20及30(因考虑Product_Name及描述约落在这个数值范围内)。由于我们预计会超过255项产品与进货厂商,但少于32,767项产品与进货厂商,为避免浪费空间或空间不足,因此将 Product_ID 及 Brand_ID 设为smallint数据型态(tinyint的范围是从0到255,而smallint的范围则至32,767),而不是tinyint或int。
使用者自订数据型别
使用者自订数据型别 (或称别名数据型别)即被自订的系统数据型别。当数个数据表同一数据行的数据型别要相同时,如相对应的数据行要一样的型别、长度和 Null 值属性,就可利用自订数据型别。您可以使用描述性的名称来定义资料型别,让程序设计简单化,并保持一致性。
举例来说,现在在同一个数据库有两个数据表,一个为 Brands 资料表;一个为 Product_Info 资料表。 Brands 数据表中的 Brand_ID 数据列要和 Product_Info 数据表中的 Brand_ID 数据列有相同的数据型别,且不允许 Null 值。这时可以建立使用者自订资料型别,并分配给这两个数据行。现在假定有几个数据表,其中的几个数据行需要相同的属性。您也许不记得其中某一个数据表中的数据行是使用了 smallint 还是tinyint,或者是否使用 Null 值。但如果之前已使用描述性名称建立使用者自订数据型别,就可使用自订数据型别,而不必担心实际的资料型别为何。
________________________________________
说明
当于特定的数据库中建立使用者自订数据型别,它只能用于该数据库中。但如果在 model 数据库(数据库模板)中建立数据型别,则可在所有之后新建立的数据库中使用。
________________________________________
利用 Enterprise Manager 建立使用者自订数据型别
建立使用者自订数据型别时,必须提供三项信息:
• 资料型别名称。
• 新数据型别是以哪一个系统数据型别为基础。
• 数据型别的 Null 值属性,即为是否允许 Null 值(在本章的 〈使用Null值〉 部分会详细讨论)。
当以上几项信息决定了,即可利用 Enterprise Manger 建立使用者自订数据型别:
1. 在 Enterprise Manager 中,展开 SQL Server 群组,然后展开服务器。
2. 展开 数据库 数据夹,展开一个数据库,如图10-1所示。
图10-1 使用Enterprise Manager定义数据型别
3. 在 使用者自订数据型别 上按鼠标右钮,从快捷菜单中选择 新增使用者自订数据型别 。出现 使用者自订的数据型别属性 窗口。
4. 在 名称 栏内输入新数据型别的名称。暂且先命名为 Brand_type ,如图10-2所示。
图10-2 「使用者自订的数据型别属性」窗口
5. 接着必须指定使用者自订型别所参照的 SQL Server 系统数据型别及长度。以这个范例为例,先将进货商代码数据列定义 smallint 这个数据型别(预设长度值为5)。如果是建立文字数据型别,可定义长度。
6. 如果数据型别允许空值,则选择 允许NULL 。(空值的详细信息请参看本章 〈使用Null值〉 部分。)
7. 如果数据型别使用预先定义的规则或默认值,则分别从清单方块中选择它们。(规则和默认值将在 第16章 中详细讨论。)
8. 按 确定 储存新数据型别。
使用 Enterprise Manager 删除使用者自订数据型别
您可以利用以下步骤删除不需要的使用者自订数据型别:
1. 在 Enterprise Manager 中,找到欲删除的使用者自订数据型别(展开 SQL Server 群组/服务器/数据库数据夹,然后展开想删除数据型别的数据库),如图10-3所示。
2. 选择 使用者自订数据型别 数据夹。使用者自订数据型别将显示在右边的窗格中,如图10-3所示。
图10-3 「使用者自订数据型别」数据夹
3. 在欲删除的使用者自订数据型别上按鼠标右钮,在快捷菜单中选择 删除 ,进入 卸除对象 ,如图10-4所示。
图10-4 「卸除对象」对话框
4. 在真正删除资料型别之前,先按一下 显示依存的情况 进入 依存性 对话框,如图10-5所示。
图10-5 「依存性」对话框
依存性对话框左边的清单方块显示依存于该使用者自订资料型别的数据库对象,右边的清单方块显示了使用者自订数据型别所依存的对象。如果有任何数据表或对象使用了此数据型别,系统将不允许删除。否则会出现错误讯息,如图10-6所示。
图10-6 删除使用中的数据型别所出现的错误讯息
5. 如果欲删除的数据型别没有相依性方面的问题,就可以关闭相依性对话框,按一下 卸除对象 窗口中的 卸除全部 ,即删除数据型别。不用担心, 卸除全部 指的是删除 卸除对象 窗口中显示的数据型别,而不是所有的使用者自订数据型别。
使用 T-SQL 建立及删除使用者自订数据型别
系统预存程序 sp_addtype 是用来定义使用者数据型别的 T-SQL 命令。当使用 model 数据库时,执行此命令,就会让所有新建立的使用者自订数据库都使用这个新的数据型别(因为所建立的使用者自订数据型别都和model数据库的属性相同)。当您利用使用者自订的数据库时执行此命令时,只会让该数据库使用新的数据型别。(记住,要使用某一个数据库,必须执行执行 USE database_name 命令。)下面的 T-SQL 命令在 model 数据库中建立了一个使用者自订数据型态:Brand_type。
USE model
GO
sp_addtype Brand_type, 'smallint', 'NOT NULL'
GO
sp_addtype 的三个参数分别为:使用者自订数据型别名称、新数据型别以何种系统数据型别为基础,及新数据型别的 Null 值属性。新数据型别 Brand_type 将出现在所有使用者自订的数据库中。如果在使用者数据库中建立了使用者自订数据型别,并要在 Enterprise Manager 中看到该型别,请在 Enterprise Manager 的执行菜单上选择 重新整理 。
要删除一个未被使用的使用者自订数据型别,在定义它的数据库中执行 sp_droptype 命令。以下示范从 model 数据库中删除 Brand_type 这个使用者自订的型别:
USE model
GO
sp_droptype Brand_type
GO
使用使用者自订数据型别别建立 Product_Info 与 Brand数据表
先回到数据库数据表的范例。利用自订的数据型别- Brand_type ,重新建立 Product_Info 数据表,然后再建立 Brand 数据表。在 Brand 数据表和 Product_Info 数据表中都会有 Brand_ID 这个数据行,我们会用相同的使用者自订型别。首先,先删除旧的 Product_Info 数据表,然后重新建立,步骤如下:
USE MyDB
GO
DROP TABLE Product_Info
GO
CREATE TABLE Product_Info
(
Product_ID smallint,
Product_Name char(20),
Description char(30),
Price smallmoney,
Brand_ID Brand_type
)
GO
CREATE TABLE Brand
(
Brand_ID Brand_type,
Brand_Name char(30),
Supplier_ID smallint
)
GO
将 Brand_type 这个数据型别指定到两个数据表中的 Brand_ID 数据行,就可确定两个数据行有一样的属性,而无须记住基底数据型别。
通常需要记住使用者自订型别数据的就是 DBA 和应用程序的程序设计师。DBA 不用说当然要了解这些,程序设计师则在写程序代码时可能需要知道数据型别,至于使用者则不需要知道这些细节。
在档案群组中建立数据表
如果您已经建立了使用者定义档案群组,SQL Server 可让您指定数据表和数据储存在哪一个档案群组中。预设情况下,除非另一个档案群组被指定为预设档案群组,否则数据表会储存在主要档案群组中。档案群组可以横跨多个磁盘或磁盘阵列上。要详细了解数据表的数据如何存放在档案和档案群组中,请参阅 第9章 。
在档案群组中建立 Product_Info 数据表
假设我们在 MyDB 数据库中建立一个命名为 Product_group 的档案群组,这个档案群组放置在次要档案群组所在的E磁盘中,而主要档案群组则在C磁盘中。这个技巧可让我们将数据及数据表和 SQL Server 系统数据表分开放置。我们还将在磁盘F建立一个记录文件,以分开记录文件I/O(请参阅本书 第9章 利用档案群组建立数据库)。
USE master
GO
CREAT DATABASE MyDB
ON PRIMARY --清楚定义主要档案群组(选择性)
--主要数据文件
(NAME = MyDBroot,
FILENAME = 'c:\mssq12k\MSSQL\data\mydbroot.mdf'
SIZE = 8MB,
MAXSIZE = 10MB,
FILEGROWTH = 1MB),
FILEGROUP product_group --下一个档案储存的档案群组
(NAME = MyDBdata1, --次要数据文件
FILENAME = 'e:\mssq12k\MSSQL\data\mydbdata1.ndf',
SIZE = 100MB,
MAXSIZE = 1500MB,
FILEGROWTH = 100MB)
LOG ON
(NAME = Logdata1, --记录文件
FILENAME = 'f:\long_files\logdata1.ldf',
SIZE = 100MB
MAXSIZE = 1500MB,
FILEGROWTH = 100MB)
GO
现在您可以使用 CREATE TABLE 命令,将 Product_Info 数据表建立在 product_group 档案群组内,方法如下:
USE MyDB
GO
CREATE TABLE Product_Info
(
Product_ID smallint,
Product_Name char(20),
Description char(30),
Price smallmoney,
Brand_ID brand_type
)
on product_group
GO
新增的数据表及所有插入数据表的数据都会放置在定义 Product_group 的E磁盘,因此,只要在同样的档案群组内没有建立其它的数据表, Product_Info 数据表中数据的I/O就有一个专门的磁盘。
使用 Null 值
空值 (Null value)是指未知的值,我们将这样的值称为 Null 。数据行的 Null值属性 是指该数据行是否接受或拒绝Null值。一个数据行中的Null值通常表示该数据行中没有值输入,可能因为这个值未知的、不适用的、或是以后才要新增。Null 值既不是没有这个值,也不是0;它们的实际值是未知的。因此,任何两个 Null 值永远不会相等。
那么何时会用到 Null 值呢?举例来说,当客户不能提供所有数据列的信息时,就需要 Null 值。例如,客户的网址,也许客户并没有网址,这个数据列就无法输入数据,这时一个数据列中的 Null 值就有了意义,也就是说现在这个数据列的数据尚未决定。
就一般的规则而言,尽可能避免使用 Null 值,因为这会增加查询和更新时的复杂度,而且有些选项(如主索引键和 IDENTITY 属性)不可在包含 Null 值的数据列中使用。
________________________________________
相关信息
在 SQL Server《在线丛书》,输入『Null值』这个关键词,在清单中选取 比较搜寻条件 即可找到相关信息。或是在本章 〈增加IDENTITY属性〉 一节有提到更多的相关信息。
________________________________________
您可以为数据行指定默认值以避免使用 NULL,所以如果一个数据行没有输入值,该数据行中就会自动填入默认值。(关于默认值的详细信息请参看 第16章 。)如果在一个数据行中允许空值, NULL将以两种方法输入该数据行:
• 如果在数据表中插入一数据列,但未对该空数据列指定数据值,SQL Server会为该数据行指定为 NULL值(除非该数据行已指定默认值)。
• 使用者可以手动输入 NULL这个字。请注意,不要输入引号("),以免被当作字符串NULL而造成混淆。
使用 NULL 建立 Product_Info 数据表
回到 Product_Info 数据表的范例,现在为每一个数据行增加空值选项。如果想让某一数据行允许Null值,请在数据型别后新增 NULL。如果不想允许Null值,则在数据型别后新增 NOT NULL。除非在使用使用者自订数据型别,且该数据型别已有定义 NULL或 NOT NULL,否则为数据行指定是否允许Null值是不错的习惯。这样可帮助您每次在设定一个数据行时都考虑到该数据行的Null值属性。
________________________________________
相关信息
在 SQL Server《在线丛书》,输入『CREATE TABLE』,向下寻找 数据表定义中的空值属性规则 主题,即可找到当 NULL或 NOT NULL 不明确指定时,数据行NULL值属性会遵照的规则。
________________________________________
回到 Product_Info 数据表的范例,替产品描述这个数据列定义接受Null值。由于 Brand_type 数据型别在之前已定义为 NOT NULL,因此不需替 brand_type 数据型别指定Null值属性。新的CREATE TABLE命令如下:
USE MyDB
GO
DROP TABLE Product_Info
GO
CREATE TABLE Product_Info
(
Product_ID smallint NOT NULL,
Product_Name char(20) NOT NULL,
Description char(30) NULL,
Price smallmoney NOT NULL,
Brand_ID brand_type
)
GO
现在,如果未指定产品描述的值,但其它四个数据行的值均有指定(在 Product_ID、Product_Name、Price、Brand_ID 这几个不接受Null值的数据行中),当输入一个产品的数据时,在数据表中会为 Description 资料行,插入 NULL在新的资料列中。如果四个不接受Null值的数据行中未输入数据,则数据列新增不会成功。
增加IDENTITY属性
建立数据表时,可以在资料行定义中增加IDENTITY属性,把某一个数据行指定为识别项数据行。如果建立的数据行具IDENTITY属性,它可让新插入的数据列依种子和递增值自动编制数据列值。 种子 (seed)是插入数据表的第一个数据列所指定识别编号。每一次插入一数据列时,会借着将递增值加至初始值来产生下个识别值,这个识别值能保证其所在数据表的唯一性。如果每一数据行都需要一个唯一的识别号码来确定其数据列的唯一性(如Product_ID数据行),识别编号属性就非常适用,无须每次新增数据列时还要考虑编号到了哪里。在一个数据表中,识别项数据行通常被当作主索引键条件约束使用,以利用其唯一性识别一个数据列。在本书 第16章 中可以找到更多有关主索引键条件约束的信息。
举例来说,如果指定了IDENTITY(0,10),则插入第1列的识别项数据行的值即为0、第2列为10、第3列为20,依此类推。如果不指定,预设的种子值和递增值为(1,1)。您必须指定两个参数或干脆都不指定。识别项数据行中不能有默认值、也不允许Null值。一个数据表只能有一个识别项数据行。
预设情况下,识别项数据行不能直接插入数据,也不能更新。如果您想重新插入已经删除的列,而且希望保留原来的识别值,您可以使用下面的叙述来修改预设设定:
SET INDETITY_INSERT tablename ON
使用这个陈述式就能插入数据列,并指定识别数据行的值。完成之后,应再使用下面的命令拒绝识别项数据行插入数据:
SET IDENTITY_INSERT tablename OFF
执行了上述的命令后,在下次插入新资料列时,SQL Server 就会以当时识别值中的最大值为种子值,进行递增的程序。
在 Product_Info 数据表中增加 IDENTITY 属性
现在我们将在 Product_Info 数据表增加IDENTITY属性。我们将把 Product_ID 数据行作为识别项数据行,此数据行中不以手动输入数据,而改由 SQL Server 自动产生识别值,以确保该识别值的唯一性。下面是建立数据表的 T-SQL 语法:
USE MyDB
GO
DROP TABLE Product_Info
GO
CREATE TABLE Product_Info
(
Product_ID smallint IDENTITY(1,1) NOT NULL,
Product_Name char(20) NOT NULL,
Description char(30) NULL,
Price smallmoney NOT NULL,
Brand_ID brand_type
)
GO
Product_ID 数据行的值将从1开始,并以1做为后续插入到数据表中数据列的递增值,以确保每一项产品唯一的识别值,而不需仰赖使用者自行输入数值。递增值可任意选择,但无论您使用的递增值为何,识别值都会是唯一的。
利用 Enterprise Manager 建立数据表
现在我们来使用 Enterprise Manager 建立数据表。记得,在实际建立数据库前,应先清楚所有数据库数据表以及相互间的关联性。要使用 Enterprise Manager 建立数据库数据表,请遵循以下步骤:
1. 在 Enterprise Manager 中展开 SQL Server群组 ,展开数据库。
2. 展开 数据库 数据夹,检视现存的数据库。
3. 展开想要操作的数据库,这里我们用 MyDB 。
4. 在 数据表 数据夹按一下鼠标右钮以显示快捷菜单,选择 新增资料表 。出现新数据表窗口,如图10-7所示(此为最大化图示)。
图10-7 「新数据表」窗口
新数据表 窗口包含一个如同电子表格一样的方格。方格中的每一列代表资料表中每一个资料行;每一个在方格中的数据行代表属性-如数据型别、长度及Null值属性。
________________________________________
说明
在为数据表的数据行命名时,应该采用一定的标准。采用什么命名标准并不重要,但命名的逻辑必须有其一致性。这种一致性可在执行查询时避免混乱。
________________________________________
5. 定义数据库中的每一个数据行(一列一列的定义),将名称输入 数据行名称 中,在 数据型别 数据行中可选取下拉式清单,定义数据型别。选择符合数据型别及该数据列的长度,在 是否允许Null值 数据列中按下SHIFT键或在该数据列中的方框中打勾以允许 Null 值(不打勾则不允许 Null 值)。 Product_Info 资料表如图10-8所示。请注意在 Brand_ID 这一数据行中,我们将 数据型别 设成使用者自订的数据型别 brand_type。要注意的是,虽然在自订这个数据型别时,我们已将 Brand_type 定义不接受 Null 值,但在 是否允许Null值 数据行中仍会将允许Null值设成预设(会打勾)。所以在这里必须将 是否允许Null值 的选取取消,以维持数据型别 Null 值属性的一致性。
数据的储存顺序会依您定义数据行的顺序储存。如果想在已输入的数据列间插入新数据列,点选欲插入的数据列后按一下鼠标右钮叫出快捷菜单,选择 插入数据行 ,如欲删除则选取想删除的数据列后按一下鼠标右钮,在快捷菜单中选择 删除数据行 。现在我们将在 Product_Info 数据表中将 Product_ID 数据行设成主索引键。选取 Product_ID 数据列后,按一下鼠标右钮,在快捷菜单中选择 设定主索引键 ,或是选取 Product_ID 数据列后,直接按一下工具列上 钥匙 的图示。就可在资料行名称旁看到如图10-9所示的 钥匙 图示。在本书 第16章 会讨论主索引件和其它条件约束。
图10-8 定义数据行的新数据表窗口
6. 在此窗口下方有 数据行 卷标页,这个卷标页可让您更改上方一些数据行的属性。举例来说,选择 Brand_ID 数据行,然后在 数据行 卷标页中的 描述 输入一些数据,在 默认值 中输入0,如图10-10所示。
图10-9「主索引键」的钥匙图标
图10-10 「数据行」卷标页
7. 在数据表中可设定其它的条件约束和索引,在数据行名称上按一下鼠标右钮,从快捷菜单中选择 索引/索引键 、 关联性 、 检查条件约束 或 属性 。或按工具列上 存盘 图标旁的 数据表和索引属性 图标。任何一种方法都可让您进入 属性 窗口,如图10-11所示。您所建立的数据表可能会在 选定的数据表 的字段出现如Table1、Table2这样的选项。我们在这里选择Table2,您可以依下一个步骤的做法更改名称。这个窗口共有4个卷标页。本书中会陆续介绍各标签页详细的设定方法。
图10-11 数据表和索引的「属性」窗口
8. 要替新数据表命名,按一下 存盘 图示,这时会出现 选择名称 对话框,这时便可以重新输入数据表名称。名称输入后按 确定 即可储存该数据表及所有设定。当您将此窗口关闭,就可在 Enterprise Manager 的右方窗口中看到刚才新增的数据表。
本章总结
在本章中,我们学习了建立数据表,包括使用及自订数据型别、在档案群组中储存数据表、使用Null值和增加IDENTITY属性。事实上还有很多其它属性可以增加到数据表中。您可以增加或删除字段、增加条件约束和索引,以及修改数据表。当然,在最理想的情况下,所建立的数据表就是最适用的数据表,但这几乎是不可能的,因为在许多情况下您会在数据表建立后才发现需要增加之前没有考虑到的索引或条件约束。 第15章 示范了几个使用 T-SQL 来修改数据表的方法。在以下几章中,您会学习安装和设定网络,以及学习 Microsoft Cluster Server。