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&