在使用數(shù)據(jù)庫的過程中,接觸最多的就是數(shù)據(jù)庫中的表。表是數(shù)據(jù)存儲的地方。是數(shù)據(jù)庫中最重要的部分,管理好表也就管理好了數(shù)據(jù)庫。本章將介紹如何創(chuàng)建和管理數(shù)據(jù)庫表。
表是由行和列組成的。創(chuàng)建表的過程主要就是定義表的列的過程,為此,應(yīng)先了解表的列的屬性。
7.1.1 列的屬性 表的列名在同一個表中具有惟一性,同一列的數(shù)據(jù)屬于同一種數(shù)據(jù)類型。除了用列名和數(shù)據(jù)類型來指定列的屬性外,還可以定義其它屬性:NULL 或NOT NULL 屬性和IDENTITY 屬性。
(1) NULL 或NOT NULL 如果表的某一列被指定具有NULL 屬性,那么就允許在插入數(shù)據(jù)時省略該列的值。反之,如果表的某一列被指定具有NOT NULL 屬性,那么就不允許在沒有指定列缺省值的情況下插入省略該列值的數(shù)據(jù)行。在SQL Server 中,列的缺省屬性是NOT NULL。要設(shè)置缺省屬性為NULL 或NOT NULL,可以在Enterprise Manager 中修改數(shù)據(jù)庫屬性選項中的“ANSI null default”為真或假。也可以使用如下兩種語句來設(shè)定:
- set ansi_null_dflt_on 或set ansi_null_dflt_off;
- sp_dboption database_name, ‘ANSI null default’, true/false。
(2) IDENTITY IDENTITY 屬性可以使表的列包含系統(tǒng)自動生成的數(shù)字。這種數(shù)字在表中可以惟一標(biāo)識表的每一行,即表中的每一行數(shù)據(jù)在指定為IDENTITY 屬性的列上的數(shù)字均不相同。指定了IDENTITY 屬性的列稱為IDENTITY 列。當(dāng)用IDENTITY 屬性定義一個列時,可以指定一個初始值和一個增量。插入數(shù)據(jù)到含有IDENTITY 列的表中時,初始值在插入第一行數(shù)據(jù)時使用,以后就由SQL Server 根據(jù)上一次使用的IDENTITY 值加上增量得到新的IDENTITY值。如果不指定初始值和增量值,則其缺省值均為1。 IDENTITY 屬性適用于INT、 SMALLINT、 TINYINT、 DECIMAL (P,0)、N::::::? UMERIC (P,0)數(shù)據(jù)類型的列。 注意:一個列不能同時具有NULL屬性和IDENTITY屬性,只能二者選其一。
7.1.2 用CREATE TABLE 命令創(chuàng)建表 用CREATE TABLE 命令創(chuàng)建表快捷、明了。其語法如下: CREATE TABLE [database_name.[owner].| owner.] table_name ( {<column_definition> | column_name AS computed_column_expression | <table_constraint>} [,...n] ) [ON {filegroup | DEFAULT} ] [TEXTIMAGE_ON {filegroup | DEFAULT} ] <column_definition> ::= { column_name data_type } [ [ DEFAULT constant_expression ] | [ IDENTITY [(seed, increment ) [NOT FOR REPLICATION] ] ] ] [ ROWGUIDCOL ] [ COLLATE < collation_name > ] [ <column_constraint>] [ ...n] 各參數(shù)說明如下:
- database_name
指定新建的表屬于哪個數(shù)據(jù)庫。如果不指定數(shù)據(jù)庫名,就會將所創(chuàng)建的表存放在當(dāng)前數(shù)據(jù)庫中。
- owner
指定數(shù)據(jù)庫所有者的用戶名。
- table_name
指定新建的表的名稱,最長不超過128 個字符。 對數(shù)據(jù)庫來說,database_name.owner_name.object_name 應(yīng)該是惟一的。
- column_name
指定新建的表的名稱,最長不超過128 個字符。 對數(shù)據(jù)庫來說,database_name.owner_name.object_name 應(yīng)該是惟一的。
- computed_column_expression
指定計算列(Computed column)的列值的表達(dá)式。表達(dá)式可以是列名、常量、變量、函數(shù)等或它們的組合。所謂計算列是一個虛擬的列,它的值并不實際存儲在表中,而是通過對同一個表中其它列進(jìn)行某種計算而得到的結(jié)果。例如:員工信息表中存儲了員工的雇傭日期,那么員工的工齡就可以通過表達(dá)式“雇傭日期當(dāng)前日期”計算出來,則工齡列就可作為一個計算列。
- ON {filegroup | DEFAULT}
指定存儲表的文件組名。如果使用了DEFAULT 選項或省略了ON 子句,則新建的表會存儲在默認(rèn)文件組中。
- TEXTIMAGE_ON
指定TEXT、NTEXT、 和IMAGE 列的數(shù)據(jù)存儲的文件組。如果無此子句,這些類型的數(shù)據(jù)就和表一起存儲在相同的文件組中。
- data_type
指定列的數(shù)據(jù)類型
- DEFAULT
指定列的缺省值。當(dāng)輸入數(shù)據(jù)時,如果用戶沒有指定列值,系統(tǒng)就會用設(shè)定的缺省值作為列值。如果該列沒有指定缺省值但允許NULL 值,則NULL 值就會作為缺省值。其中缺省值可以為常數(shù)、NULL 值、SQL Server 內(nèi)部函數(shù)(如GETDATE()函數(shù))、NILADIC 函數(shù)等。
- constant_expression
列缺省值的常量表達(dá)式,可以為一個常量或系統(tǒng)函數(shù)或NULL。
- IDENTITY
指定列為IDENTITY 列。一個表中只能有一個IDENTITY 列。
- seed
指定IDENTITY 列的初始值。
- increment
指定IDENTITY 列的增量。
- NOT FOR REPLICATION
指定列的IDENTITY 屬性在把從其它表中復(fù)制的數(shù)據(jù)插入到表中時不發(fā)生作用,即不足的生成列值,使得復(fù)制的數(shù)據(jù)行保持原來的列值。
- ROWGUIDCOL
指定列為全球惟一鑒別行號列(ROWGUIDCOL是Row Global Unique Identifier Column 的縮寫)。此列的數(shù)據(jù)類型必須為UNIQUEIDENTIFIER 類型。一個表中數(shù)據(jù)類型為UNIQUEIDENTIFIER 的列中只能有一個列被定義為ROWGUIDCOL 列。ROWGUIDCOL 屬性不會使列值具有惟一性,也不會自動生成一個新的數(shù)值給插入的行。需要在INSERT 語句中使用NEWID()函數(shù)或指定列的缺省值為NEWID()函數(shù)。
- COLLATE指明表使用的校驗方式。
- column_constraint 和table_constraint
指定列約束和表約束,我們將在下一節(jié)中介紹其具體定義。 其余參數(shù)將在后面的章節(jié)中逐步講述。
注意:一個表至少有一列,但最多不超過1024個列。 每個數(shù)據(jù)庫中最多可以創(chuàng)建200萬個表。 表在存儲時使用的計量單位是盤區(qū)(Extent)。一個盤區(qū)分為8個數(shù)據(jù)頁,每頁8KB字節(jié)。在創(chuàng)建新表時,會分配給它一個初始只為一個盤區(qū)的存儲空間。當(dāng)增加表的存儲空間時,以盤區(qū)為單位增加。

7.1.3 用Enterprise Manager 創(chuàng)建表 在Enterprise Manager 中創(chuàng)建表按以下步驟進(jìn)行: (1) 在要創(chuàng)建表的數(shù)據(jù)庫中選擇“Tables” 對象后,單擊右鍵,從快捷菜單中選擇“New Table” 選項,或在工具欄中選擇圖標(biāo) ,即會出現(xiàn)如圖7-1 所示的定義列對話框。在此可以是設(shè)定表的列名、數(shù)據(jù)類型、精度、缺省值等屬性。

(2) 單擊圖7-1 工具欄中的保存按鈕 ,即出現(xiàn)如圖7-2 所示的輸入新建表名的對話框。
 (3) 輸入表名后單擊“OK”按鈕,即會將表保存到數(shù)據(jù)庫中。然后圖7-1 中工具欄右邊原來不可用的幾個按鈕將變?yōu)榭捎茫梢允褂盟鼈儊碓O(shè)置表的其它信息,在以后的章節(jié)中將講到它們的使用。
7.1.4 創(chuàng)建臨時表 可以用CREATE TABLE 命令創(chuàng)建表局部的或全局作用的臨時表。其語法與創(chuàng)建一般表基本相同,只是在局部臨時表的表名前要使用符號“#”,全局臨時表的表名前要使用符號“##”以便與一般的表相區(qū)別。由于SQL Server 將臨時表的表名存儲到Tempdb數(shù)據(jù)庫中sysobjects 表中時,會自動在其后面添加一個系統(tǒng)產(chǎn)生的12 位的數(shù)字后綴,因此臨時表的表名最長只能指定116 個字符,以不超過128 個字符的命名限制。 例7-2 創(chuàng)建一個局部臨時表test123 create table #test123 ( test_id smallint , test_name char(10) , ) on [primary
|