第04章表的存儲原理及完整性創(chuàng)建管理_第1頁
第04章表的存儲原理及完整性創(chuàng)建管理_第2頁
第04章表的存儲原理及完整性創(chuàng)建管理_第3頁
第04章表的存儲原理及完整性創(chuàng)建管理_第4頁
第04章表的存儲原理及完整性創(chuàng)建管理_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、第4章 表的存儲原理及完整性創(chuàng)建管理 4.1 SQL Server表的類型表的類型 4.2 表的存儲原理表的存儲原理4.3 SQL Server數(shù)據(jù)類型數(shù)據(jù)類型 4.4 數(shù)據(jù)表的創(chuàng)建和管理數(shù)據(jù)表的創(chuàng)建和管理 4.1 SQL Server表的類型 4.1.1 SQL Server的臨時表的臨時表 4.1.2 SQL Server的系統(tǒng)表的系統(tǒng)表 4.1.1 SQL Server的臨時表 SQL Server中的數(shù)據(jù)表分為:中的數(shù)據(jù)表分為: 永久表:創(chuàng)建后一直存儲在數(shù)據(jù)庫文件中,直到用戶永久表:創(chuàng)建后一直存儲在數(shù)據(jù)庫文件中,直到用戶刪除為止。刪除為止。 臨時表分兩種:臨時表分兩種: 局部臨時表:表

2、名用局部臨時表:表名用#開頭。只能由創(chuàng)建它的用戶使用,開頭。只能由創(chuàng)建它的用戶使用,在該用戶連接斷開時,它被自動刪除。在該用戶連接斷開時,它被自動刪除。 全局臨時表:表名用全局臨時表:表名用#開頭。當(dāng)前所有連接用戶都可開頭。當(dāng)前所有連接用戶都可以使用,它在最后一個會話結(jié)束時被自動刪除。以使用,它在最后一個會話結(jié)束時被自動刪除。 系統(tǒng)根據(jù)表名前有無系統(tǒng)根據(jù)表名前有無#符號確定創(chuàng)建的是臨時表還是永符號確定創(chuàng)建的是臨時表還是永久表。久表。4.1.2 SQL Server的系統(tǒng)表和系統(tǒng)視圖 系統(tǒng)表中的數(shù)據(jù)組成了系統(tǒng)表中的數(shù)據(jù)組成了SQL ServerSQL Server系統(tǒng)利用的數(shù)據(jù)字系統(tǒng)利用的數(shù)據(jù)字

3、典,系統(tǒng)表記錄所有服務(wù)器活動的信息,是維護所有典,系統(tǒng)表記錄所有服務(wù)器活動的信息,是維護所有存儲在其中的所有對象、數(shù)據(jù)類型、約束、配置選項存儲在其中的所有對象、數(shù)據(jù)類型、約束、配置選項等可利用資源的相關(guān)信息。等可利用資源的相關(guān)信息。 一些系統(tǒng)表和系統(tǒng)視圖只存在于一些系統(tǒng)表和系統(tǒng)視圖只存在于mastermaster數(shù)據(jù)庫,它們數(shù)據(jù)庫,它們包含系統(tǒng)級信息。包含系統(tǒng)級信息。 還有一些系統(tǒng)表則存在于每一個數(shù)據(jù)庫(包括還有一些系統(tǒng)表則存在于每一個數(shù)據(jù)庫(包括mastermaster數(shù)據(jù)庫),它們包含屬于這個特定數(shù)據(jù)庫的對象和資數(shù)據(jù)庫),它們包含屬于這個特定數(shù)據(jù)庫的對象和資源的相關(guān)信息源的相關(guān)信息。 注意

4、:注意:不允許使用不允許使用SQLSQL語句直接修改系統(tǒng)表中的內(nèi)容;語句直接修改系統(tǒng)表中的內(nèi)容;不允許編寫程序直接訪問系統(tǒng)表中的信息;如果需要不允許編寫程序直接訪問系統(tǒng)表中的信息;如果需要系統(tǒng)表信息,可以通過系統(tǒng)的存儲過程和系統(tǒng)提供的系統(tǒng)表信息,可以通過系統(tǒng)的存儲過程和系統(tǒng)提供的函數(shù)進行。函數(shù)進行。 4.2 表的存儲原理 4.2.1 內(nèi)部存儲概述內(nèi)部存儲概述 4.2.2 數(shù)據(jù)行(記錄)結(jié)構(gòu)數(shù)據(jù)行(記錄)結(jié)構(gòu) 4.2.1 內(nèi)部存儲概述 表是有關(guān)某個特定實例的數(shù)據(jù)集合,在關(guān)系數(shù)據(jù)庫中處表是有關(guān)某個特定實例的數(shù)據(jù)集合,在關(guān)系數(shù)據(jù)庫中處于核心地位。于核心地位。 創(chuàng)建一個表,就會有一行或多行插入到用來管

5、理這個表創(chuàng)建一個表,就會有一行或多行插入到用來管理這個表的多個系統(tǒng)表里。至少要寫信息到的多個系統(tǒng)表里。至少要寫信息到sysobjects、sysindexes和和syscolumns這三個系統(tǒng)表里,當(dāng)新建的表這三個系統(tǒng)表里,當(dāng)新建的表有外碼約束時,相關(guān)的信息還會插入到有外碼約束時,相關(guān)的信息還會插入到sysrefrences系統(tǒng)系統(tǒng)表里。表里。 Sysobjects主要記錄新表的基本信息,如表名、對象主要記錄新表的基本信息,如表名、對象ID以以及表的所有者等等。及表的所有者等等。 Syscolumns主要記錄新表列的信息,如列名、類型和長度主要記錄新表列的信息,如列名、類型和長度等。等。 Sy

6、sindexes系統(tǒng)表記錄包含指向新表所使用的存儲空間的系統(tǒng)表記錄包含指向新表所使用的存儲空間的指針和有關(guān)新表大小的信息。指針和有關(guān)新表大小的信息。 sysrefrences系統(tǒng)表里記錄參照表的外鍵信息。系統(tǒng)表里記錄參照表的外鍵信息。 例如:創(chuàng)建一個表,它在系統(tǒng)表中的記錄信息如下圖所示:例如:創(chuàng)建一個表,它在系統(tǒng)表中的記錄信息如下圖所示:sysobjectssyscolumnssysindexes注意: 當(dāng)一個新表剛創(chuàng)建時,在插入第一行數(shù)據(jù)之前系統(tǒng)不當(dāng)一個新表剛創(chuàng)建時,在插入第一行數(shù)據(jù)之前系統(tǒng)不會立即為其分配存儲空間,因此會立即為其分配存儲空間,因此Sysindexes表中指示頁表中指示頁地址

7、和預(yù)留存儲空間的列將都是地址和預(yù)留存儲空間的列將都是0值。值。 如果在該表上定義了如果在該表上定義了PRIMARY KEY或或UNIQUE約束,約束,而而PRIMARY KEY或或UNIQUE約束的背后是由簇集索約束的背后是由簇集索引支持的,則該表在引支持的,則該表在Sysindexes中對應(yīng)行的中對應(yīng)行的indid值為值為1。 任何有非簇集索引支持的其他約束在任何有非簇集索引支持的其他約束在Sysindexes表中都表中都有一行,而且該行的有一行,而且該行的indid值在值在2到到250之間。之間。 4.2.2 數(shù)據(jù)行(記錄)結(jié)構(gòu)1 1、定長記錄、定長記錄在定長記錄里,每個字段都有固定的長度

8、,而且字段數(shù)也是固定在定長記錄里,每個字段都有固定的長度,而且字段數(shù)也是固定的。這種記錄的字段能夠連續(xù)存儲,因此在給定記錄地址的情況的。這種記錄的字段能夠連續(xù)存儲,因此在給定記錄地址的情況下,借助系統(tǒng)目錄里有關(guān)字段的長度信息就能計算出某個特殊字下,借助系統(tǒng)目錄里有關(guān)字段的長度信息就能計算出某個特殊字段的的地址。段的的地址。2 2、變長記錄、變長記錄對于變長記錄來說,一種可能的記錄組織方式就是像定長記錄一對于變長記錄來說,一種可能的記錄組織方式就是像定長記錄一樣連續(xù)地存放字段,字段之間通過分割符隔開。這種組織方式需樣連續(xù)地存放字段,字段之間通過分割符隔開。這種組織方式需要掃描記錄才能定位需要訪問

9、的字段。要掃描記錄才能定位需要訪問的字段。另一種方法是在記錄開始處預(yù)留一些空間作為存放一個整數(shù)偏移另一種方法是在記錄開始處預(yù)留一些空間作為存放一個整數(shù)偏移量數(shù)組的空間,數(shù)組中的第量數(shù)組的空間,數(shù)組中的第I I個整數(shù)表示記錄的第個整數(shù)表示記錄的第I I個字段的其始個字段的其始地址,當(dāng)然這個地址是相對于記錄的起始地址的。另外在數(shù)組中地址,當(dāng)然這個地址是相對于記錄的起始地址的。另外在數(shù)組中也存儲記錄尾部的偏移量,這個偏移量用來識別最后一個字段的也存儲記錄尾部的偏移量,這個偏移量用來識別最后一個字段的結(jié)束位置。結(jié)束位置。 1、 SQL Server定長記錄的存儲首先來看最簡單的情況,記錄中所有字段都是

10、定長的。首先來看最簡單的情況,記錄中所有字段都是定長的。CREATE TABLE FixedCREATE TABLE Fixed( (col1 int NOT NULLcol1 int NOT NULLcol2 char(5) NOT NULLcol2 char(5) NOT NULLcol3 char(3) NULLcol3 char(3) NULLcol4 float NOT NULLcol4 float NOT NULL) )當(dāng)這個表被創(chuàng)建以后,就有類似下面一個記錄被插入到當(dāng)這個表被創(chuàng)建以后,就有類似下面一個記錄被插入到sysindexessysindexes系統(tǒng)表中:系統(tǒng)表中:id n

11、ame indid first minlenid name indid first minlen2099048 Fixed 0 0 x000000000000 242099048 Fixed 0 0 x000000000000 24而其各個字段則會被插入到而其各個字段則會被插入到syscolumnssyscolumns系統(tǒng)表中:系統(tǒng)表中:name colid xtype length xoffsetname colid xtype length xoffsetcol1 1 56 4 4col1 1 56 4 4col2 2 175 5 8col2 2 175 5 8col3 3 175 3 1

12、3col3 3 175 3 13col4 4 62 8 16col4 4 62 8 161、 SQL Server定長記錄的存儲當(dāng)往當(dāng)往FixedFixed表中插入一個記錄數(shù)據(jù)時,例如:表中插入一個記錄數(shù)據(jù)時,例如:INSERT INTO Fixed VALUES(123,INSERT INTO Fixed VALUES(123,ABCDABCD,NULL,45.5),NULL,45.5)FixedFixed表在表在sysindexessysindexes系統(tǒng)表里的內(nèi)容就會發(fā)生變化:系統(tǒng)表里的內(nèi)容就會發(fā)生變化:id name indid first minlenid name indid fi

13、rst minlen2099048 Fixed 0 0 x720000000000 242099048 Fixed 0 0 x720000000000 24這說明在插入了一記錄數(shù)據(jù)之后,這說明在插入了一記錄數(shù)據(jù)之后,SQL ServerSQL Server就為就為FixedFixed表分配表分配了一個數(shù)據(jù)頁。了一個數(shù)據(jù)頁。FixedFixed表只包含四個定長字段,表只包含四個定長字段,sysindexessysindexes表中表中minlenminlen字段的值表示記錄的最小長度,該長度恰好是字段的值表示記錄的最小長度,該長度恰好是syscolumnssyscolumns表中表示字段長度的表

14、中表示字段長度的lengthlength的數(shù)字之和再加上的數(shù)字之和再加上4 4個字節(jié)。其中額個字節(jié)。其中額外的外的4 4個字節(jié)是用于記錄字段數(shù)目的兩個字節(jié)和表示字段中個字節(jié)是用于記錄字段數(shù)目的兩個字節(jié)和表示字段中NULLNULL的字節(jié)數(shù)。的字節(jié)數(shù)。 第一個字節(jié)是狀態(tài)位第一個字節(jié)是狀態(tài)位A A,它的值是,它的值是0 x100 x10,表示只有位,表示只有位4 4是是1 1,其他位,其他位都是都是0 0,因此該記錄沒有變長字段(如果位,因此該記錄沒有變長字段(如果位5 5為為1 1說明存在變長字說明存在變長字段)。段)。 最后一個字節(jié)是最后一個字節(jié)是NULLNULL位圖,其值位圖,其值4 4意味只

15、有第三位是意味只有第三位是1 1,表示第三,表示第三個字段是個字段是NULLNULL。1 1、 SQL ServerSQL Server定長記錄的存儲定長記錄的存儲2、 SQL Server變長記錄的存儲 CREATE TABLE VariableCREATE TABLE Variable( (col1 char(3) NOT NULLcol1 char(3) NOT NULLcol2 varchar(15) NOT NULLcol2 varchar(15) NOT NULLcol3 varchar(5) NULLcol3 varchar(5) NULLcol4 varchar(10) NOT

16、 NULLcol4 varchar(10) NOT NULLcol5 smallint NOT NULLcol5 smallint NOT NULL) )當(dāng)這個表被創(chuàng)建以后,就有類似下面一個記錄被插入到當(dāng)這個表被創(chuàng)建以后,就有類似下面一個記錄被插入到sysindexessysindexes系統(tǒng)表中:系統(tǒng)表中:id name indid first minlenid name indid first minlen18099105 Variable 0 0 x000000000000 918099105 Variable 0 0 x000000000000 9而其各個字段則會被插入到而其各個字段則

17、會被插入到syscolumnssyscolumns系統(tǒng)表中:系統(tǒng)表中:name colid xtype length xoffsetname colid xtype length xoffsetcol1 1 175 3 4col1 1 175 3 4col2 2 167 15 -1col2 2 167 15 -1col3 3 167 5 -1col3 3 167 5 -1col4 4 167 10 -1col4 4 167 10 -1col5 5 52 2 7col5 5 52 2 72、 SQL Server變長記錄的存儲當(dāng)往當(dāng)往VariableVariable表中插入一個記錄數(shù)據(jù)時,例如:

18、表中插入一個記錄數(shù)據(jù)時,例如:INSERT INTO Variable VALUES(INSERT INTO Variable VALUES(xyzxyz, ,ABCDeABCDe,NULL, ,NULL, 123123,999),999)VariableVariable表在表在sysindexessysindexes系統(tǒng)表里的內(nèi)容就會發(fā)生變化:系統(tǒng)表里的內(nèi)容就會發(fā)生變化:id name indid first minlenid name indid first minlen18099105 Variable 0 0 x880000000000 918099105 Variable 0 0 x

19、880000000000 9定長字段的數(shù)據(jù)位于記錄中由定長字段的數(shù)據(jù)位于記錄中由syscolumnssyscolumns的的xoffsetxoffset值指定的字值指定的字節(jié)偏移量所在的位置,即節(jié)偏移量所在的位置,即col1col1起始于字節(jié)偏移量起始于字節(jié)偏移量4 4的位置,而的位置,而col5col5起始于字節(jié)偏移量起始于字節(jié)偏移量7 7的位置。的位置。 為了找到變長字段,首先要確定記錄中列偏移數(shù)組的位置。在表示總字段數(shù)的為了找到變長字段,首先要確定記錄中列偏移數(shù)組的位置。在表示總字段數(shù)的2 2個個字節(jié)(其值是字節(jié)(其值是05000500)和表示位圖的)和表示位圖的1 1字節(jié)(其值為字節(jié)(

20、其值為0404)之后就是變長字段數(shù)的兩個)之后就是變長字段數(shù)的兩個字節(jié),在本例中其值是字節(jié),在本例中其值是03000300,換算成十進制是,換算成十進制是3 3,說明該記錄有,說明該記錄有3 3個變長字段存在。個變長字段存在。緊跟其后的字節(jié)就是變長字段偏移數(shù)組。該例變長字段偏移數(shù)組用三個緊跟其后的字節(jié)就是變長字段偏移數(shù)組。該例變長字段偏移數(shù)組用三個2 2字節(jié)來表字節(jié)來表示示3 3個變長字段在記錄中的結(jié)束位置。個變長字段在記錄中的結(jié)束位置。19001900經(jīng)過字節(jié)交換是經(jīng)過字節(jié)交換是0 x00190 x0019,所以第一個變,所以第一個變長字段結(jié)束于長字段結(jié)束于2525字節(jié)處。接下來也是字節(jié)處。

21、接下來也是0 x00190 x0019,所以第二個變長字段實際長度為,所以第二個變長字段實際長度為0 0,表明沒有任何東西存儲在變長數(shù)據(jù)區(qū)域。表明沒有任何東西存儲在變長數(shù)據(jù)區(qū)域。1c001c00經(jīng)過字節(jié)交換是經(jīng)過字節(jié)交換是0 x001c0 x001c,所以第三,所以第三個變長字段結(jié)束于個變長字段結(jié)束于2828字節(jié)處,而且整個記錄也結(jié)束于字節(jié)處,而且整個記錄也結(jié)束于2828字節(jié)處,換句話說,目前字節(jié)處,換句話說,目前整個記錄的實際長度是整個記錄的實際長度是2828個字節(jié)長。個字節(jié)長。 4.3 SQL Server數(shù)據(jù)類型 4.3.1 數(shù)值型數(shù)據(jù)數(shù)值型數(shù)據(jù) 4.3.2 貨幣型數(shù)據(jù)貨幣型數(shù)據(jù) 4.3

22、.3 字符型數(shù)據(jù)字符型數(shù)據(jù) 4.3.4 日期日期/時間數(shù)據(jù)類型時間數(shù)據(jù)類型 4.3.1 數(shù)值型數(shù)據(jù)BigintBigint??梢源娣艔???梢源娣艔?2-26363到到2 26363-1-1范圍內(nèi)的整型數(shù)據(jù)。以范圍內(nèi)的整型數(shù)據(jù)。以bigintbigint數(shù)據(jù)類型存儲數(shù)據(jù)類型存儲的每個值占用的每個值占用8 8個字節(jié),共個字節(jié),共6464位,其中位,其中6363位用于存儲數(shù)字,位用于存儲數(shù)字,1 1位用于表示正負(fù)。位用于表示正負(fù)。IntInt。也可以寫作。也可以寫作integerinteger,可以存儲從,可以存儲從-2-23131到到2 23131-1-1范圍內(nèi)的全部整數(shù)。以范圍內(nèi)的全部整數(shù)。以i

23、ntint數(shù)據(jù)類型存儲的每個值占用數(shù)據(jù)類型存儲的每個值占用4 4個字節(jié),共個字節(jié),共3232位,其中位,其中3131位用于存儲數(shù)字,位用于存儲數(shù)字,1 1位用于表示正負(fù)的區(qū)別。位用于表示正負(fù)的區(qū)別。SmallintSmallint。可以存儲從??梢源鎯?2-21515到到2 21515- 1- 1范圍內(nèi)的所有整數(shù)。以范圍內(nèi)的所有整數(shù)。以smallintsmallint數(shù)據(jù)類數(shù)據(jù)類型存儲的每個值占用型存儲的每個值占用2 2個字節(jié),共個字節(jié),共1616位,其中位,其中1515位用于存儲數(shù)字,位用于存儲數(shù)字,1 1位用于表示位用于表示正負(fù)的區(qū)別。正負(fù)的區(qū)別。TinyintTinyint??梢源鎯?。

24、可以存儲0 0到到255255范圍內(nèi)的所有整數(shù)。以范圍內(nèi)的所有整數(shù)。以tinyinttinyint數(shù)據(jù)類型存儲的每數(shù)據(jù)類型存儲的每個值占用個值占用1 1個字節(jié)。個字節(jié)。DecimalDecimal和和NumericNumeric。在。在SQL ServerSQL Server中,中,decimaldecimal和和numericnumeric型數(shù)據(jù)的最高精型數(shù)據(jù)的最高精度的可以達(dá)到度的可以達(dá)到3838位,也就是說必須在位,也就是說必須在-10-103838-1-1到到10103838-1-1之間。格式為:之間。格式為:DecimalDecimal(n,dn,d)或)或NumericNumeri

25、c(n,dn,d),其中),其中n n為總的位數(shù),為總的位數(shù),d d為小數(shù)位數(shù)。為小數(shù)位數(shù)。floatfloat和和realreal。floatfloat型數(shù)據(jù)范圍從型數(shù)據(jù)范圍從-1.79E+38-1.79E+38到到1.79E+381.79E+38,RealReal型數(shù)據(jù)范圍型數(shù)據(jù)范圍從從-3.40E+38-3.40E+38到到3.40E+383.40E+38。其中。其中floatfloat可采用科學(xué)記數(shù)法表示,格式為可采用科學(xué)記數(shù)法表示,格式為 : floatfloat(n n),),n n必須在必須在153153之間。之間。 4.3.2 貨幣型數(shù)據(jù) MoneyMoney。它存儲的貨幣值由

26、。它存儲的貨幣值由2 2個個4 4字節(jié)整數(shù)構(gòu)成。前面的一個字節(jié)整數(shù)構(gòu)成。前面的一個4 4字字節(jié)表示貨幣值的整數(shù)部分,后面的一個節(jié)表示貨幣值的整數(shù)部分,后面的一個4 4字節(jié)表示貨幣值的小數(shù)字節(jié)表示貨幣值的小數(shù)部分。以部分。以MoneyMoney存儲的貨幣值的范圍從存儲的貨幣值的范圍從-2-26363到到2 26363-1-1,可以精確到萬,可以精確到萬分之一貨幣單位。分之一貨幣單位。SmallmoneySmallmoney。它存儲的貨幣值由。它存儲的貨幣值由2 2個個2 2字節(jié)整數(shù)構(gòu)成。前面的一字節(jié)整數(shù)構(gòu)成。前面的一個個2 2字節(jié)表示貨幣值的整數(shù)部分,后面的一個字節(jié)表示貨幣值的整數(shù)部分,后面的一

27、個2 2字節(jié)表示貨幣值的字節(jié)表示貨幣值的小數(shù)部分。以小數(shù)部分。以SmallmoneySmallmoney存儲的貨幣值的范圍從存儲的貨幣值的范圍從-214,748.3648-214,748.3648到到+214,748.3647+214,748.3647,也可以精確到萬分之一貨幣單位。,也可以精確到萬分之一貨幣單位。 4.3.3 字符型數(shù)據(jù) CharChar。利用。利用CharChar數(shù)據(jù)類型存儲數(shù)據(jù)時,每個字符占用一個字節(jié)的存數(shù)據(jù)類型存儲數(shù)據(jù)時,每個字符占用一個字節(jié)的存儲空間。儲空間。CharChar數(shù)據(jù)類型使用固定長度來存儲字符,最長可以容納數(shù)據(jù)類型使用固定長度來存儲字符,最長可以容納800

28、08000個字符。利用個字符。利用CharChar數(shù)據(jù)類型來定義表列或者定義變量時,應(yīng)該給定數(shù)數(shù)據(jù)類型來定義表列或者定義變量時,應(yīng)該給定數(shù)據(jù)的最大長度。如果實際數(shù)據(jù)的字符長度短于給定的最大長度,則多據(jù)的最大長度。如果實際數(shù)據(jù)的字符長度短于給定的最大長度,則多余的字節(jié)會用空格填充。如果實際數(shù)據(jù)的字符長度超過了給定的最大余的字節(jié)會用空格填充。如果實際數(shù)據(jù)的字符長度超過了給定的最大長度,則超過的字符將會被截斷。在使用字符型常量為字符數(shù)據(jù)類型長度,則超過的字符將會被截斷。在使用字符型常量為字符數(shù)據(jù)類型賦值時,必須使用單引號(賦值時,必須使用單引號()將字符型常量括起來。)將字符型常量括起來。Varch

29、arVarchar。VarcharVarchar數(shù)據(jù)類型的使用方式與數(shù)據(jù)類型的使用方式與CharChar數(shù)據(jù)類型類似。數(shù)據(jù)類型類似。SQL SQL Server Server 利用利用VarcharVarchar數(shù)據(jù)類型來存儲最長可以達(dá)到數(shù)據(jù)類型來存儲最長可以達(dá)到80008000字符的變長字字符的變長字符。與符。與Char Char 數(shù)據(jù)類型不同,數(shù)據(jù)類型不同,VarcharVarchar數(shù)據(jù)類型的存儲空間隨存儲在表數(shù)據(jù)類型的存儲空間隨存儲在表列中的每一個數(shù)據(jù)的字符數(shù)的不同而變化。列中的每一個數(shù)據(jù)的字符數(shù)的不同而變化。TextText。當(dāng)要存儲的字符型數(shù)據(jù)非常龐大以至于。當(dāng)要存儲的字符型數(shù)據(jù)非

30、常龐大以至于80008000字節(jié)完全不夠用字節(jié)完全不夠用時,時,CharChar和和VarcharVarchar數(shù)據(jù)類型都失去了作用。這時應(yīng)該選擇數(shù)據(jù)類型都失去了作用。這時應(yīng)該選擇TextText數(shù)據(jù)數(shù)據(jù)類型。類型。 TextText數(shù)據(jù)類型專門用于存儲數(shù)量龐大的變長字符數(shù)據(jù)。最大數(shù)據(jù)類型專門用于存儲數(shù)量龐大的變長字符數(shù)據(jù)。最大長度可以達(dá)到長度可以達(dá)到2 23131-1-1個字符,約個字符,約2GB2GB。 4.3.4 日期/時間數(shù)據(jù)類型 DatetimeDatetime。DatetimeDatetime數(shù)據(jù)類型范圍從數(shù)據(jù)類型范圍從17531753年年1 1月月1 1日到日到99999999年

31、年1212月月3131日,可以精確到千分之一秒。日,可以精確到千分之一秒。DatetimeDatetime數(shù)據(jù)類型的數(shù)據(jù)占用數(shù)據(jù)類型的數(shù)據(jù)占用8 8個字節(jié)的存儲空間。個字節(jié)的存儲空間。SmalldatetimeSmalldatetime。SmalldatetimeSmalldatetime數(shù)據(jù)范圍從數(shù)據(jù)范圍從19001900年年1 1月月1 1日到日到20792079年年6 6月月6 6日,可以精確到分。日,可以精確到分。SmalldatetimeSmalldatetime數(shù)據(jù)類型占數(shù)據(jù)類型占4 4個字個字節(jié)的存儲空間。節(jié)的存儲空間。 4.4 數(shù)據(jù)表的創(chuàng)建和管理 4.4.1 數(shù)據(jù)表結(jié)構(gòu)的創(chuàng)建數(shù)

32、據(jù)表結(jié)構(gòu)的創(chuàng)建 4.4.2 數(shù)據(jù)表結(jié)構(gòu)的管理數(shù)據(jù)表結(jié)構(gòu)的管理 4.4.1 數(shù)據(jù)表結(jié)構(gòu)的創(chuàng)建數(shù)據(jù)表結(jié)構(gòu)的創(chuàng)建 在在SQL Server 2000中,每個數(shù)據(jù)庫中最多可以創(chuàng)中,每個數(shù)據(jù)庫中最多可以創(chuàng)建建200萬個表,用戶創(chuàng)建數(shù)據(jù)庫表時,最多可以定萬個表,用戶創(chuàng)建數(shù)據(jù)庫表時,最多可以定義義1024列,也就是可以定義列,也就是可以定義1024個字段。個字段。 SQL Server 2000提供了兩種方法創(chuàng)建數(shù)據(jù)庫表:提供了兩種方法創(chuàng)建數(shù)據(jù)庫表: 第一種方法是利用企業(yè)管理器(第一種方法是利用企業(yè)管理器(Enterprise Manager)創(chuàng)建表;)創(chuàng)建表; 另一種方法是利用另一種方法是利用Transa

33、ct-SQL語句中的語句中的create命命令創(chuàng)建表。令創(chuàng)建表。1. 利用create命令創(chuàng)建表 其語法形式如下:其語法形式如下: CREATE TABLE ( 列級完整性約束條件列級完整性約束條件 , 列級完整性約束條件列級完整性約束條件 , )1. 利用create命令創(chuàng)建表參數(shù)說明:參數(shù)說明:(1 1) 是所要定義的基本表的名字。一個表它可以由一個或是所要定義的基本表的名字。一個表它可以由一個或多個屬性組成。多個屬性組成。(2 2) 一般取有實際意義的名字。一般取有實際意義的名字。(3 3) 可以是前面介紹的數(shù)據(jù)類型。可以是前面介紹的數(shù)據(jù)類型。(4 4)在)在SQL Server 200

34、0SQL Server 2000中有下面幾種完整性約束條件:中有下面幾種完整性約束條件: 空值約束(空值約束(NULL or NOT NULL);主鍵約束();主鍵約束(primary key constraint);唯一性約束();唯一性約束(unique constraint);檢查約束);檢查約束(check constraint);缺省約束();缺省約束(default constraint);外部鍵);外部鍵約束(約束(foreign key constraint);規(guī)則();規(guī)則(rule);缺省值);缺省值(default)。)。 2關(guān)于創(chuàng)建表時運用約束的說明 (1 1)空值約束

35、()空值約束(NULL or NOT NULLNULL or NOT NULL)空值空值NULLNULL約束決定屬性值是否允許為空值(約束決定屬性值是否允許為空值(NULLNULL)。)。NULLNULL表示沒表示沒有輸入任何內(nèi)容,它不是零和空白,不允許為空值則用有輸入任何內(nèi)容,它不是零和空白,不允許為空值則用NOT NULLNOT NULL表示。表示。例如:設(shè)置屬性例如:設(shè)置屬性teacherteacher允許為空值。允許為空值。 CREATE TABLE t ( teacher char(8) NULL )2關(guān)于創(chuàng)建表時運用約束的說明(2 2)主鍵約束()主鍵約束(primary key

36、constraintprimary key constraint) 主健約束要求主健屬性取值必須惟一,一個表只能包含一個主主健約束要求主健屬性取值必須惟一,一個表只能包含一個主健約束。如果沒有在主健約束中指定健約束。如果沒有在主健約束中指定CLUSTEREDCLUSTERED或或NONCLUSTEREDNONCLUSTERED,并且沒有為并且沒有為UNIQUEUNIQUE約束指定聚集索引,則將對該主健約束用約束指定聚集索引,則將對該主健約束用CLUSTEREDCLUSTERED。主鍵約束主鍵約束SQLSQL的語法形式如下:的語法形式如下: CONSTRAINT 約束名約束名 PRIMARY K

37、EY CLUSTERED|NONCLUSTERED(列名(列名,n) 例如:在執(zhí)行創(chuàng)建產(chǎn)品信息表的操作時,指定產(chǎn)品編號為主鍵值。例如:在執(zhí)行創(chuàng)建產(chǎn)品信息表的操作時,指定產(chǎn)品編號為主鍵值。 CREATE TABLE products (id char(10) NOT NULL,name char(20) NOT NULL,price money,quantity smallint NULL,CONSTRAINT pk_products PRIMARY KEY CLUSTERED (id) )此例的主健名稱是此例的主健名稱是pk_products,在,在products表中關(guān)于表中關(guān)于id建立了一

38、個索引排建立了一個索引排序。序。2關(guān)于創(chuàng)建表時運用約束的說明(3 3)唯一性約束()唯一性約束(unique constraintunique constraint)唯一性約束用于指定一個或者多個列的組合的值具有唯一性,以防唯一性約束用于指定一個或者多個列的組合的值具有唯一性,以防止在列中輸入重復(fù)的值。止在列中輸入重復(fù)的值。 創(chuàng)建唯一性約束創(chuàng)建唯一性約束SQLSQL語句:語句:CONSTRAINT 約束名約束名 UNIQUE CLUSTERED|NONCLUSTERED(列名(列名,n) 例:例: CREATE TABLE student1 (sno char(8), sname char(1

39、6), constraint pk_student primary key(sno), constraint uniq_student unique(sname) 2關(guān)于創(chuàng)建表時運用約束的說明(4 4)檢查約束()檢查約束(check constraintcheck constraint)使用檢查約束時,應(yīng)該注意以下幾點:使用檢查約束時,應(yīng)該注意以下幾點: 一個列級檢查約束只能與限制的字段有關(guān);一個表級檢查約一個列級檢查約束只能與限制的字段有關(guān);一個表級檢查約束只能與限制的表中字段有關(guān)。束只能與限制的表中字段有關(guān)。 一個表中可以定義多個檢查約束。一個表中可以定義多個檢查約束。 每個每個CREA

40、TE TABLECREATE TABLE語句中每個字段只能定義一個檢查約束。語句中每個字段只能定義一個檢查約束。 在多個字段上定義檢查約束,則必須將檢查約束定義為表級在多個字段上定義檢查約束,則必須將檢查約束定義為表級約束。約束。 檢查約束中不能包含子查詢。檢查約束中不能包含子查詢。創(chuàng)建檢查約束創(chuàng)建檢查約束SQLSQL語法格式為:語法格式為: CONSTRAINT constraint_nameCHECK NOT FOR REPLICATION (logical_expression) 例如:創(chuàng)建一個職工信息表,其中輸入性別字段值時,只能接受例如:創(chuàng)建一個職工信息表,其中輸入性別字段值時,只能

41、接受“F F”或者或者“M M”,并且為,并且為phonenumphonenum字段創(chuàng)建檢查約束,限制只能輸入類似字段創(chuàng)建檢查約束,限制只能輸入類似0108079865401080798654之類的數(shù)據(jù),而不能隨意輸入其他數(shù)據(jù)。之類的數(shù)據(jù),而不能隨意輸入其他數(shù)據(jù)。 create table employee( Id char(8), name char(8) CHECK(NAME LIKE A-C,a-cA-Z,a-zA-ZA-Z), sex char(2), phonenum int, constraint chk_sex check(sex in (F,M)default F, Const

42、raint chk_phonenum check(phonenum like (010)8,90-90-90-9 0-90-90-90-9))2關(guān)于創(chuàng)建表時運用約束的說明(6 6)外部鍵約束)外部鍵約束外部鍵約束用于強制參照完整性,提供單個字段或者多個字段的外部鍵約束用于強制參照完整性,提供單個字段或者多個字段的參照完整性。當(dāng)使用外部鍵約束時,應(yīng)該考慮以下幾個因素:參照完整性。當(dāng)使用外部鍵約束時,應(yīng)該考慮以下幾個因素: 外部鍵約束提供了字段參照完整性。外部鍵約束提供了字段參照完整性。 外部鍵從句中的字段數(shù)目和每個字段指定的數(shù)據(jù)類型必須和外部鍵從句中的字段數(shù)目和每個字段指定的數(shù)據(jù)類型必須和REF

43、ERENCESREFERENCES從句中的字段相匹配。從句中的字段相匹配。 外部鍵約束不能自動創(chuàng)建索引,需要用戶手動創(chuàng)建。外部鍵約束不能自動創(chuàng)建索引,需要用戶手動創(chuàng)建。 一個表中最多可以有一個表中最多可以有3131個外部鍵約束。個外部鍵約束。 在臨時表中,不能使用外部鍵約束。在臨時表中,不能使用外部鍵約束。 主鍵和外部鍵的數(shù)據(jù)類型必須嚴(yán)格匹配。主鍵和外部鍵的數(shù)據(jù)類型必須嚴(yán)格匹配。外鍵約束外鍵約束SQLSQL的語法形式如下:的語法形式如下:CONSTRAINT CONSTRAINT 約束名約束名 FOREIGN KEY FOREIGN KEY (外鍵列名)(外鍵列名)REFERENCES REF

44、ERENCES 參照表(參照列名)參照表(參照列名) 外鍵約束主要用來維護兩個表之間的一致性關(guān)系。外鍵約束主要用來維護兩個表之間的一致性關(guān)系。 外鍵的建立主要是通過將一個表的主鍵所在列包含在另一外鍵的建立主要是通過將一個表的主鍵所在列包含在另一個表中,這些列就是另一個表的外鍵。個表中,這些列就是另一個表的外鍵。外鍵的作用不只是對輸入自身的數(shù)據(jù)進行限制,同時也限制了對主鍵所在表的數(shù)據(jù)進行修改。用戶無法對主鍵里的數(shù)據(jù)進行修改和刪除,除非事先刪除或修改外鍵引用的數(shù)據(jù)。3數(shù)據(jù)表結(jié)構(gòu)創(chuàng)建實例 【例例4-14-1】創(chuàng)建數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫“教學(xué)管理教學(xué)管理”的數(shù)據(jù)表的數(shù)據(jù)表 包括學(xué)生表、課程表、教師表、開課表

45、和選課表包括學(xué)生表、課程表、教師表、開課表和選課表 數(shù)據(jù)表結(jié)構(gòu)如表數(shù)據(jù)表結(jié)構(gòu)如表1-3、表、表1-4、表、表1-5、表、表1-6和表和表1-7所示,所示,各表的完整性約束如表各表的完整性約束如表1-8、表、表1-9、表、表1-10、表、表1-11、表表1-12所示。所示。 以學(xué)生表創(chuàng)建為例以學(xué)生表創(chuàng)建為例 方法一、企業(yè)或資源管理器方法一、企業(yè)或資源管理器3數(shù)據(jù)表結(jié)構(gòu)創(chuàng)建實例 圖4-4 新建數(shù)據(jù)表 圖4-5 利用表設(shè)計器創(chuàng)建表結(jié)構(gòu) 3數(shù)據(jù)表結(jié)構(gòu)創(chuàng)建實例 第一步:創(chuàng)建表第一步:創(chuàng)建表 在樹狀目錄中找到要建表的數(shù)據(jù)庫。在樹狀目錄中找到要建表的數(shù)據(jù)庫。 在該數(shù)據(jù)庫上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇

46、在該數(shù)據(jù)庫上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“新建新建”“表表”命令命令 表設(shè)計器的上半部分有一個表格,在這個表格中輸表設(shè)計器的上半部分有一個表格,在這個表格中輸入列的屬性,表格的每一行對應(yīng)一列。對每一列都需入列的屬性,表格的每一行對應(yīng)一列。對每一列都需要進行設(shè)置要進行設(shè)置 設(shè)置完成后,單擊工具欄上的設(shè)置完成后,單擊工具欄上的“保存保存”按鈕。在出按鈕。在出現(xiàn)的選擇名稱對話框中輸入表名現(xiàn)的選擇名稱對話框中輸入表名“學(xué)生表學(xué)生表”。 單擊單擊“確定確定”按鈕退出。按鈕退出。3數(shù)據(jù)表結(jié)構(gòu)創(chuàng)建實例 第二步:設(shè)置完整性約束第二步:設(shè)置完整性約束 展開企業(yè)管理器的數(shù)據(jù)庫展開企業(yè)管理器的數(shù)據(jù)庫“教學(xué)管

47、理教學(xué)管理”,單擊,單擊“表表”節(jié)點,選定數(shù)據(jù)表節(jié)點,選定數(shù)據(jù)表STUDENTSTUDENT,單擊右鍵,在快捷菜單上,單擊右鍵,在快捷菜單上,單擊單擊“設(shè)計表設(shè)計表”。 設(shè)置主鍵約束(設(shè)置主鍵約束(PRIMARY KEYPRIMARY KEY),光標(biāo)移到需要設(shè)),光標(biāo)移到需要設(shè)置主鍵的字段學(xué)號,單擊工具欄上的主鍵按鈕,學(xué)號置主鍵的字段學(xué)號,單擊工具欄上的主鍵按鈕,學(xué)號列名左側(cè)出現(xiàn)列名左側(cè)出現(xiàn)“鑰匙鑰匙”圖標(biāo)。圖標(biāo)。 如果要設(shè)置多屬性作為主鍵,可以通過按住如果要設(shè)置多屬性作為主鍵,可以通過按住鍵,鍵,用鼠標(biāo)左鍵依次單擊要選定的列,選定多列后,單擊用鼠標(biāo)左鍵依次單擊要選定的列,選定多列后,單擊工具

48、欄上的主鍵按鈕。取消主鍵設(shè)置的方法是,選定工具欄上的主鍵按鈕。取消主鍵設(shè)置的方法是,選定主鍵字段,單擊主鍵按鈕即可。主鍵字段,單擊主鍵按鈕即可。 設(shè)置主鍵后,系統(tǒng)自動建立了一個索引。設(shè)置主鍵后,系統(tǒng)自動建立了一個索引。3數(shù)據(jù)表結(jié)構(gòu)創(chuàng)建實例 表設(shè)計器上右擊,出現(xiàn)快捷菜單,在上面單擊表設(shè)計器上右擊,出現(xiàn)快捷菜單,在上面單擊“屬性屬性”,出現(xiàn)屬性,出現(xiàn)屬性對話框。對話框。 在屬性對話框中選擇在屬性對話框中選擇“索引索引/鍵鍵”選項,系統(tǒng)設(shè)置表學(xué)號屬性為主鍵,選項,系統(tǒng)設(shè)置表學(xué)號屬性為主鍵,因此自動在表中建立一個根據(jù)學(xué)號的值的大小升序排列的索引。因此自動在表中建立一個根據(jù)學(xué)號的值的大小升序排列的索引。 設(shè)置檢查約束(設(shè)置檢查約束(CHECKCHECK),學(xué)生表定義了三個),學(xué)生表定義了三個CHECKCHECK約束,第一個約約束,第一個約束是學(xué)號,根據(jù)約束要求,邏輯表達(dá)式為束是學(xué)號,根據(jù)約束要求,邏輯表達(dá)式為“(sno LIKE sno LIKE S0-90-S0-90-90-90-90-90-990-90-90-90-9)”,其他兩個同上操作,其他兩個同上操作。單擊單擊“CHECKCHECK約

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論