- SQL Server 2016 數據庫教程(第4版)
- 鄭阿奇 劉啟芬 顧韻華主編
- 2368字
- 2019-12-20 19:40:46
3.3 命令方式創建表結構
用命令方式同樣可以創建表結構、修改表結構和刪除表。
3.3.1 創建表結構:CREATE TABLE
創建表使用CREATE TABLE命令,其語法格式如下:
CREATE TABLE [數據庫名. [架構名] . | 架構名. ]表名 ( <列定義> …… [ <表約束> ] ) ……
其中,<列定義>為:
列名 數據類型 / *指定列名、列的數據類型* / [ FILESTREAM ] / *指定FILESTREAM屬性* / [ COLLATE排序名] / *指定排序規則* / [ NULL | NOT NULL ] / *指定是否為空* / [ [ CONSTRAINT約束名] DEFAULT常量表達式 / *指定默認值* / ] | [ IDENTITY [ (初值, 增量) ] [ NOT FOR REPLICATION ]] / *指定列為標識列* / [ ROWGUIDCOL ] / *指定列為全局標識符列* / [ <列約束> … ] / *指定列的約束* /
說明
(1)FILESTREAM:它允許以獨立文件的形式存放大對象數據,而不是像以往一樣將所有數據都保存到數據文件中。
(2)NULL | NOT NULL:NULL表示列可以取空值,NOT NULL表示列不可以取空值。
(3)DEFAULT常量表達式:為所在列指定默認值,默認值“常量表達式”必須是一個常量值、標量函數或NULL值。DEFAULT定義可適用于除定義為timestamp或帶identity屬性的列以外的任何列。
(4)IDENTITY:指出該列為標識符列,為該列提供一個唯一的、遞增的值。“初值”是標識字段的起始值,默認值為1;“增量”是標識增量,默認值為1。如果為IDENTITY屬性指定了NOT FOR REPLICATION選項,則復制代理執行插入時,標識列中的值將不會增加。
(5)ROWGUIDCOL:表示新列是行的全局唯一標識符列,ROWGUIDCOL屬性只能指派給uniqueidentifier列。該屬性并不強制列中所存儲值的唯一性,也不會為插入到表中的新行自動生成值。
(6)<列約束>:列的完整性約束,指定主鍵、替代鍵、外鍵等。例如,指定該列為主鍵則使用PRIMARY KEY關鍵字。
注意
SQL Server中創建的表通常稱為持久表。在數據庫中持久表一旦創建將一直存在,多個用戶或者多個應用程序可以同時使用持久表。有時需要臨時存放數據,例如,臨時存儲復雜的SELECT語句的結果。此后,可能要重復地使用這個結果,但這個結果又不需要永久保存,這時,可以使用臨時表。用戶可以像操作持久表一樣操作臨時表。只不過臨時表的生命周期較短,當斷開與該數據庫的連接時,服務器會自動刪除它們。
在表名稱前添加“#”或“##”符號,創建的表就是臨時表,添加“#”符號表示創建的是本地臨時表,只能由創建者使用。添加“##”符號表示創建的是全局臨時表,可以由所有的用戶使用。
【例3.1】設已經創建了數據庫test1,現在該數據庫中需創建學生情況表xsb1,該表的結構如表3.3所示。
在“SSMS”中單擊“新建查詢”,在“查詢編輯器”中輸入下列T-SQL命令(見圖3.2)。
USE test1 GO CREATE TABLE xsb1 ( 學號 char(6) NOT NULL PRIMARY KEY, 姓名 char(8) NOT NULL, 性別 bit NULL DEFAULT 1, 出生時間 date NULL, 專業 char(12) NULL DEFAULT ‘計算機’, 總學分 i nt NULL DEFAULT 0, 備注 varchar(500) NULL ) GO
因為當前數據庫是“xscj”,使用USE test1語句將數據庫test1指定為當前數據庫,然后使用CREATE TABLE語句在該數據庫中創建表xsb1。如果在“SSMS”中當前的數據庫為“test1”,則不需要使用USE test1語句。
執行命令后,在test1數據庫中就創建了xsb1表,并且當前數據庫變成了“test”,此后在test1數據庫中操作不需要使用“USE test1”命令。

圖3.2 執行結果
【例3.2】創建一個帶計算列的表“pcj”,表中包含課程的課程號、總成績和學習該課程的人數,以及課程的平均成績。
CREATE TABLE pcj ( 課程號 char(3) PRIMARY KEY, 總成績 real NOT NULL, 人數 int NOT NULL, 平均成績AS總成績/人數PERSISTED )
說明
如果沒有使用PERSISTED關鍵字,則在計算列上不能添加PRIMARY KEY、UNIQUE、DEFAULT等約束條件。由于計算列上的值是通過服務器計算得到的,因而在插入或修改數據時不能對計算列賦值。
3.3.2 修改表結構:ALTER TABLE
修改表結構可以使用ALTER TABLE命令,語法格式如下:
ALTER TABLE [數據庫名.[架構名]. | 架構名. ]表名 { ALTER COLUMN列名{…} / *修改已有列的屬性* / | ADD / *添加列* / { <列定義> | 列名AS表達式[PERSISTED [NOT NULL]] / *定義計算列* / | <表約束> } [ , … ] | DROP { [ CONSTRAINT ]約束名 / *刪除約束* / [ WITH ( <刪除聚集約束選項> … ) ] | COLUMN列名 / *刪除列* / } [ , … ] | [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT { ALL | 約束名 } …… }
1. 命令主體
ALTER TABLE命令主體結構說明如下。
(1)表名:要修改的表名。
(2)ALTER COLUMN子句:修改表中指定列的屬性,“列名”給出要修改的列。
若表中該列所存數據的數據類型與將要修改的列類型沖突,則發生錯誤。例如,原來char類型的列要修改成int類型,而原來列值包含非數字字符,則無法修改。
(3)ADD子句:向表中增加新列,新列的定義方法與CREATE TABLE命令中定義列的方法相同。一次還可以添加多個列,中間用逗號隔開。
(4)DROP子句:從表中刪除列或約束。
注意
在刪除一個列以前,必須先刪除基于該列的所有索引和約束。
(5)WITH子句:[WITH{CHECK|NOCHECK}]指定表中的數據是否用新添加的或重新啟用的FOREIGN KEY或CHECK約束進行驗證。ALL關鍵字指定啟用或禁用所有約束。有關FOREIGNKEY和CHECK約束的內容將在后面章節專門介紹。
2. ALTER COLUMN子句
該子句的內容格式為:
ALTER COLUMN列名 { 類型名[ ( 精度[ , 位數] ) ] [ COLLATE排序名] [ NULL | NOT NULL ] …… }
(1)類型名:為被修改列的新的數據類型。當要修改成數值類型時,可以使用“( 精度[ ,位數] )”分別指定數值的精度和小數位數。
(2)[NULL | NOT NULL]:表示將列設置為是否可為空,設置成NOT NULL時要注意表中該列是否有空數據。
【例3.3】在test1數據庫xsb1表中增加“入學時間”列。
在SSMS中新建一個查詢,并輸入如下腳本:
USE test1 GO ALTER TABLE xsb1 ADD入學時間date GO
輸入完成后執行該腳本,然后可以在“對象資源管理器”中展開“xscj”中表dbo.xsb的結構查看執行結果。如果原表中已經存在和添加列同名的列,則語句運行將出錯。
【例3.4】修改表xsb1中已有列的屬性:將名為“姓名”的列長度由原來的8改為10;將名為“入學時間”的列的數據類型由原來的date改為small datetime。
新建一個查詢,在查詢分析器中輸入并執行如下腳本:
ALTER TABLE xsb1 ALTER COLUMN姓名char(10) GO ALTER TABLE xsb1 ALTER COLUMN入學時間smalldatetime GO
說明
在ALTER TABLE語句中,一次只能包含ALTER COLUMN、ADD、DROP子句中的一條。而且使用ALTER COLUMN子句時一次只能修改一個列的屬性,所以這里需要使用兩條ALTER TABLE語句。
如果刪除“入學時間”列,則命令如下:
ALTER TABLE xsb1 DROP COLUMN入學時間 GO
3.3.3 刪除表:DROP TABLE
語法格式:
DROP TABLE [數據庫名.[架構名]. | 架構名. ] 表名[ , ... ] [ ; ]
其中,“表名”是要被刪除的表的名稱。刪除表后,數據庫中不再存在(包括表結構)。
例如,刪除test1數據庫中的pcj表。命令如下:
DROP TABLE pcj