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

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

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