《02第二章表的存储原理及完整性创建管理》由会员分享,可在线阅读,更多相关《02第二章表的存储原理及完整性创建管理(75页珍藏版)》请在金锄头文库上搜索。
1、SQL Server,第2章 表的存储原理及完整性创建管理,第2章 表的存储原理及完整性创建管理,2.1 表的存储原理 2.2 SQL Server表的类型 2.3 SQL Server数据类型 2.4 数据表的创建和管理,2.1 表的存储原理,2.1.1 内部存储概述 2.1.2 数据行(记录)结构,2.1.1 内部存储概述,表是有关某个特定实例的数据集合,在关系数据库中处于核心地位。创建一个表,就会有一行或多行插入到用来管理这个表的多个系统表里。例如要写信息到 sysobjects、sysindexes和syscolumns等系统表里。通过查询sys.tables、sys.objects、
2、sys.indexes、和sys.columns等系统视图可以查看相关信息。,Sysobjects主要记录新对象的基本信息,如对象名、对象ID等等。Syscolumns主要记录新表列的信息,如列名、类型和长度等。 Sysindexes系统表记录索引等相关信息。,注意:,当一个新表刚创建时,在插入第一行数据之前系统不会立即为其分配存储空间,因此Sysindexes表中指示页地址和预留存储空间的列将都是0值。如果在该表上定义了PRIMARY KEY或UNIQUE约束,而PRIMARY KEY或UNIQUE约束的背后是由簇集索引支持的,则该表在Sysindexes中对应行的index_id值为1。任
3、何有非簇集索引支持的其他约束在Sysindexes表中都有一行,而且该行的index_id值在2到250之间。,2.1.2 数据行(记录)结构,在 SQL Server 中,数据存储的基本单位是页。紧跟着页头的就是存储表的真正数据行区域。单个数据行的最大长度是8060字节。数据行不能跨页存储(文本和图像例外)。页内数据行的多少依赖于表的结构和要存储的数据。如果一个表的所有列都是定长,那么该表在每一页上存储相同数目的行。如果一个表里有变长列,那么该表总是在每一页上存储尽可能多的行。,2.1.2 数据行(记录)结构,1、定长记录在定长记录里,每个字段都有固定的长度,而且字段数也是固定的。这种记录的
4、字段能够连续存储,因此在给定记录地址的情况下,借助系统目录里有关字段的长度信息就能计算出某个特殊字段的地址。2、变长记录对于变长记录来说,一种可能的记录组织方式就是像定长记录一样连续地存放字段,字段之间通过分割符隔开。这种组织方式需要扫描记录才能定位需要访问的字段。另一种方法是在记录开始处预留一些空间作为存放一个整数偏移量数组的空间,数组中的第I个整数表示记录的第I个字段的其始地址,当然这个地址是相对于记录的起始地址的。另外在数组中也存储记录尾部的偏移量,这个偏移量用来识别最后一个字段的结束位置。,1、 SQL Server定长记录的存储,首先来看最简单的情况,记录中所有字段都是定长的。CRE
5、ATE TABLE Fixed(col1 int NOT NULL,col2 char(5) NOT NULL,col3 char(3) NULL,col4 float NOT NULL)当这个表被创建以后,就有一个记录被插入到systables系统表中;而其各个字段则会被插入到syscolumns系统表中。,第一个字节是状态位A,它的值是0x10,表示只有位4是1,其他位都是0,因此该记录没有变长字段(如果位5为1说明存在变长字段)。 最后一个字节是NULL位图,其值4意味只有第三位是1,表示第三个字段是NULL。,1、 SQL Server定长记录的存储,2、 SQL Server变长记录
6、的存储,CREATE TABLE Variable(col1 char(3) NOT NULL,col2 varchar(15) NOT NULL,col3 varchar(5) NULL,col4 varchar(10) NOT NULL,col5 smallint NOT NULL)当这个表被创建以后,就有一个记录被插入到systables系统表中;而其各个字段则会被插入到syscolumns系统表中。,2、 SQL Server变长记录的存储,往Variable表中插入一个记录数据时,例如:INSERT INTO Variable VALUES(xyz,ABCDe,NULL, 123,9
7、99),为了找到变长字段,首先要确定记录中列偏移数组的位置。在表示总字段数的2个字节(其值是0500)和表示位图的1字节(其值为04)之后就是变长字段数的两个字节,在本例中其值是0300,换算成十进制是3,说明该记录有3个变长字段存在。紧跟其后的字节就是变长字段偏移数组。该例变长字段偏移数组用三个2字节来表示3个变长字段在记录中的结束位置。1900经过字节交换是0x0019,所以第一个变长字段结束于25字节处。接下来也是0x0019,所以第二个变长字段实际长度为0,表明没有任何东西存储在变长数据区域。1c00经过字节交换是0x001c,所以第三个变长字段结束于28字节处,而且整个记录也结束于2
8、8字节处,换句话说,目前整个记录的实际长度是28个字节长。,2.2 SQL Server表的类型,2.2.1 SQL Server的临时表 2.2.2 SQL Server的系统表,2.2 SQL Server表的类型,SQL Server中的数据表分为:永久表:创建后一直存储在数据库文件中,直到用户删除为止。临时表:本地临时表和全局临时表系统根据表名前有无#符号确定创建的是临时表还是永久表。,2.2.1 SQL Server的临时表,临时表分两种:本地临时表:表名用#开头。只能由创建它的用户使用,在该用户连接断开时,它被自动删除。全局临时表:表名用#开头。当前所有连接用户都可以使用,它在最后
9、一个会话结束时被自动删除。,2.2.2 SQL Server的系统表,系统表中的数据组成了SQL Server系统利用的数据字典,系统表记录所有服务器活动的信息,是维护所有存储在其中的所有对象、数据类型、约束、配置选项等可利用资源的相关信息。一些系统表只存在于master数据库,它们包含系统级信息。而一些系统表则存在于每一个数据库(包括master数据库),它们包含属于这个特定数据库的对象和资源的相关信息。注意:不允许使用SQL语句直接修改系统表中的内容;如果需要系统表信息,可以通过系统的存储过程和系统提供的函数进行。,2.3 SQL Server数据类型,2.3.1 数值型数据 2.3.2
10、货币型数据 2.3.3 字符型数据 2.3.4 日期/时间数据类型 2.3.5 二进制数据类型 2.3.6 双字节数据类型,2.3.1 数值型数据,Bigint。可以存放从-263到263-1范围内的整型数据。以bigint数据类型存储的每个值占用8个字节,共64位,其中63位用于存储数字,1位用于表示正负。Int。也可以写作integer,可以存储从-231到231-1范围内的全部整数。以int数据类型存储的每个值占用4个字节,共32位,其中31位用于存储数字,1位用于表示正负的区别。Smallint。可以存储从-215到215- 1范围内的所有整数。以smallint数据类型存储的每个值占
11、用2个字节,共16位,其中15位用于存储数字,1位用于表示正负的区别。Tinyint。可以存储0到255范围内的所有整数。以tinyint数据类型存储的每个值占用1个字节。Decimal和Numeric。在SQL Server中,decimal和numeric型数据的最高精度的可以达到38位,也就是说必须在-1038-1到1038-1之间。格式为:Decimal(n,d)或Numeric(n,d),其中n为总的位数,d为小数位数。float和real。float型数据范围从-1.79E+38到1.79E+38,Real型数据范围从-3.40E+38到3.40E+38。其中float可采用科学记
12、数法表示,格式为 :float(n),n必须在153之间。,2.3.2 货币型数据,Money。它存储的货币值由2个4字节整数构成。前面的一个4字节表示货币值的整数部分,后面的一个4字节表示货币值的小数部分。以Money存储的货币值的范围从-263到263-1,可以精确到万分之一货币单位。Smallmoney。它存储的货币值由2个2字节整数构成。前面的一个2字节表示货币值的整数部分,后面的一个2字节表示货币值的小数部分。以Smallmoney存储的货币值的范围从-214,748.3648到+214,748.3647,也可以精确到万分之一货币单位。,2.3.3 字符型数据,Char。利用Char
13、数据类型存储数据时,每个字符占用一个字节的存储空间。Char数据类型使用固定长度来存储字符,最长可以容纳8000个字符。利用Char数据类型来定义表列或者定义变量时,应该给定数据的最大长度。如果实际数据的字符长度短于给定的最大长度,则多余的字节会用空格填充。如果实际数据的字符长度超过了给定的最大长度,则超过的字符将会被截断。在使用字符型常量为字符数据类型赋值时,必须使用单引号()将字符型常量括起来。Varchar。Varchar数据类型的使用方式与Char数据类型类似。SQL Server 利用Varchar数据类型来存储最长可以达到8000字符的变长字符。与Char 数据类型不同,Varch
14、ar数据类型的存储空间随存储在表列中的每一个数据的字符数的不同而变化。Text。当要存储的字符型数据非常庞大以至于8000字节完全不够用时,Char和Varchar数据类型都失去了作用。这时应该选择Text数据类型。 Text数据类型专门用于存储数量庞大的变长字符数据。最大长度可以达到231-1个字符,约2GB。,2.3.4 日期/时间数据类型,Datetime。Datetime数据类型范围从1753年1月1日到9999年12月31日,可以精确到千分之一秒。Datetime数据类型的数据占用8个字节的存储空间。Smalldatetime。Smalldatetime数据范围从1900年1月1日到
15、2079年6月6日,可以精确到分。Smalldatetime数据类型占4个字节的存储空间。,2.3.5 二进制数据类型,所谓二进制数据是一些用十六进制来表示的数据。例如,十进制数据245表示成十六进制数据就应该是F5。(1)binary。具有固定的长度,最大长度可以达到8K字节。(2)varbinary。具有不固定的长度,其最大长度也不得超过8K字节。(3)Image。该数据类型可用于存储字节数超过8K字节的数据,比如Microsoft Word文档、Microsoft Excel图表以及图像数据(包括.GIF、.BMP、.JPEG文件)等。,2.3.6 双字节数据类型,(1)Nchar(n)
16、。Nchar(n)是固定长度的双字节数据类型,括号里的n用来定义数据的最大长度。n的取值范围是14000。(2)Nvarchar(n)。Nvarchar(n)数据类型存储可变长度的双字节数据类型,括号里的n用来定义数据的最大长度。n的取值为04000。(3)Ntext(n)。Ntext数据类型存储的是可变长度的双字节字符,Ntext数据类型突破了前2种双字节数据类型不能超过4000字符的规定,最多可以存储多达230-1个双字节字符。,2.4 数据表的创建和管理,2.4.1 数据表结构的创建 2.4.2 数据表结构的管理,2.4.1 数据表结构的创建,在SQL Server 中,每个数据库中最多可以创建 20 亿个表,用户创建数据库表时,最多可以定义1024列,也就是可以定义1024个字段。 SQL Server 提供了两种方法创建数据库表:第一种方法是利用SSMS创建表;另一种方法是利用Transact-SQL语句中的create命令创建表。,