創建新表
語法
CREATE TABLE
[ database_name
[ owner ]
| owner
] table_name
( { < column_definition >
| column_name AS computed_column_expression
| < table_constraint > ::= [ CONSTRAINT constraint_name ] }
| [ { PRIMARY KEY | UNIQUE } [
n ]
)
[ ON { filegroup | DEFAULT } ]
[ TEXTIMAGE_ON { filegroup | DEFAULT } ]
< column_definition > ::= { column_name data_type }
[ COLLATE < collation_name > ]
[ [ DEFAULT constant_expression ]
| [ IDENTITY [ ( seed
increment ) [ NOT FOR REPLICATION ] ] ]
]
[ ROWGUIDCOL]
[ < column_constraint > ] [
n ]
< column_constraint > ::= [ CONSTRAINT constraint_name ]
{ [ NULL | NOT NULL ]
| [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor ]
[ON {filegroup | DEFAULT} ] ]
]
| [ [ FOREIGN KEY ]
REFERENCES ref_table [ ( ref_column ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
]
| CHECK [ NOT FOR REPLICATION ]
( logical_expression )
}
< table_constraint > ::= [ CONSTRAINT constraint_name ]
{ [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
{ ( column [ ASC | DESC ] [
n ] ) }
[ WITH FILLFACTOR = fillfactor ]
[ ON { filegroup | DEFAULT } ]
]
| FOREIGN KEY
[ ( column [
n ] ) ]
REFERENCES ref_table [ ( ref_column [
n ] ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ]
( search_conditions )
}
參數
database_name
是要在其中創建表的數據庫名稱
database_name 必須是現有數據庫的名稱
如果不指定數據庫
database_name 默認為當前數據庫
當前連接的登錄必須在 database_name 所指定的數據庫中有關聯的現有用戶 ID
而該用戶 ID 必須具有創建表的權限
owner
是新表所有者的用戶 ID 名
owner 必須是 database_name 所指定的數據庫中的現有用戶 ID
owner 默認為與 database_name 所指定的數據庫中的當前連接相關聯的用戶 ID
如果 CREATE TABLE 語句由 sysadmin 固定服務器角色成員或 database_name 所指定的數據庫中的 db_dbowner 或 db_ddladmin 固定數據庫角色成員執行
則 owner 可以指定與當前連接的登錄相關聯的用戶 ID 以外的其它用戶 ID
如果與執行 CREATE TABLE 語句的登錄相關聯的用戶 ID 僅具有創建表的權限
則 owner 必須指定與當前登錄相關聯的用戶 ID
sysadmin 固定服務器角色成員或別名為 dbo 用戶的登錄與用戶 ID dbo 相關聯
因此
由這些用戶創建的表的默認所有者為 dbo
不是由上述兩種角色的登錄創建的表所有者默認為與該登錄相關聯的用戶 ID
table_name
是新表的名稱
表名必須符合標識符規則
數據庫中的 owner
table_name 組合必須唯一
table_name 最多可包含
個字符
但本地臨時表的表名(名稱前有一個編號符 #)最多只能包含
個字符
column_name
是表中的列名
列名必須符合標識符規則
並且在表內唯一
以 timestamp 數據類型創建的列可以省略 column_name
如果不指定 column_name
timestamp 列的名稱默認為 timestamp
computed_column_expression
是定義計算列值的表達式
計算列是物理上並不存儲在表中的虛擬列
計算列由同一表中的其它列通過表達式計算得到
例如
計算列可以這樣定義
cost AS price * qty
表達式可以是非計算列的列名
常量
函數
變量
也可以是用一個或多個運算符連接的上述元素的任意組合
表達式不能為子查詢
計算列可用於選擇列表
WHERE 子句
ORDER BY 子句或任何其它可使用常規表達式的位置
但下列情況除外
計算列不能用作 DEFAULT 或 FOREIGN KEY 約束定義
也不能與 NOT NULL 約束定義一起使用
但是
如果計算列由具有確定性的表達式定義
並且索引列中允許計算結果的數據類型
則可將該列用作索引中的鍵列
或用作 PRIMARY KEY 或 UNIQUE 約束的一部分
例如
如果表中含有整型列 a 和 b
則可以在計算列 a+b 上創建索引
但不能在計算列 a+DATEPART(dd
GETDATE()) 上創建索引
因為在以後的調用中
其值可能發生改變
計算列不能作為 INSERT 或 UPDATE 語句的目標
說明 表中計算列所使用的列值因行而異
因此每行的計算列值可能不同
計算列的為空性是由 SQL Server 根據使用的表達式自動確定的
即使只有不可為空的列
大多數表達式的結果也認為是可為空的
因為可能的下溢或溢出也將生成 NULL 結果
使用 COLUMNPROPERTY 函數(AllowsNull 屬性)查看表中任何計算列的為空性
通過指定 ISNULL(check_expression
constant)
其中常量為替代任何 NULL 結果的非 NULL 值
可為空的表達式 expr 可以轉換為不可為空的表達式
ON {filegroup | DEFAULT}
指定存儲表的文件組
如果指定 filegroup
則表將存儲在指定的文件組中
數據庫中必須存在該文件組
如果指定 DEFAULT
或者根本未指定 ON 參數
則表存儲在默認文件組中
ON {filegroup | DEFAULT} 也可以在 PRIMARY KEY 約束或 UNIQUE 約束中指定
這些約束會創建索引
如果指定 filegroup
則索引將存儲在指定的文件組中
如果指定 DEFAULT
則索引將存儲在默認文件組中
如果約束中沒有指定文件組
則索引將與表存儲在同一文件組中
如果 PRIMARY KEY 約束或 UNIQUE 約束創建聚集索引
則表的數據頁將與索引存儲在同一文件組中
說明 在 ON {filegroup | DEFAULT} 和 TEXTIMAGE_ON {filegroup | DEFAULT} 的上下文中
DEFAULT 並不是關鍵字
DEFAULT 是默認文件組的標識符並需對其進行定界
如 ON
DEFAULT
ON [DEFAULT] 和 TEXTIMAGE_ON
DEFAULT
或 TEXTIMAGE_ON [DEFAULT]
TEXTIMAGE_ON
是表示 text
ntext 和 image 列存儲在指定文件組中的關鍵字
如果表中沒有 text
ntext 或 image 列
則不能使用 TEXTIMAGE ON
如果沒有指定 TEXTIMAGE_ON
則 text
ntext 和 image 列將與表存儲在同一文件組中
data_type
指定列的數據類型
可以是系統數據類型或用戶定義數據類型
用戶定義數據類型必須先用 sp_addtype 創建
然後才能在表定義中使用
在 CREATE TABLE 語句中
用戶定義數據類型的 NULL/NOT NULL 賦值可被替代
但長度標准不能更改
不能在 CREATE TABLE 語句中指定用戶定義數據類型的長度
DEFAULT
如果在插入過程中未顯式提供值
則指定為列提供的值
DEFAULT 定義可適用於除定義為 timestamp 或帶 IDENTITY 屬性的列以外的任何列
除去表時
將刪除 DEFAULT 定義
只有常量值(如字符串)
系統函數(如 SYSTEM_USER())或 NULL 可用作默認值
為保持與 SQL Server 早期版本的兼容
可以給 DEFAULT 指派約束名
constant_expression
是用作列的默認值的常量
NULL 或系統函數
IDENTITY
表示新列是標識列
當向表中添加新行時
Microsoft® SQL Server
; 將為該標識列提供一個唯一的
遞增的值
標識列通常與 PRIMARY KEY 約束一起用作表的唯一行標識符
可以將 IDENTITY 屬性指派給 tinyint
smallint
int
bigint
decimal(p
) 或 numeric(p
) 列
對於每個表只能創建一個標識列
不能對標識列使用綁定默認值和 DEFAULT 約束
必須同時指定種子和增量
或者二者都不指定
如果二者都未指定
則取默認值 (
)
seed
是裝入表的第一行所使用的值
increment
是添加到前一行的標識值的增量值
NOT FOR REPLICATION
表示當復制登錄(如 sqlrepl)向表中插入數據時
不強制 IDENTITY 屬性
復制的行必須保留發布數據庫中所賦予的鍵值
NOT FOR REPLICATION 子句確保不向復制進程所插入的行賦予新的標識值
其它登錄所插入的行仍然具有以通常的方式創建的新標識值
建議同時使用具有 NOT FOR REPLICATION 的 CHECK 約束
以確保賦予的標識值處於當前數據庫所需的范圍內
ROWGUIDCOL
表示新列是行的全局唯一標識符列
對於每個表只能指派一個 uniqueidentifier 列作為 ROWGUIDCOL 列
ROWGUIDCOL 屬性只能指派給 uniqueidentifier 列
如果數據庫兼容級別小於或等於
則 ROWGUIDCOL 關鍵字無效
RO
From:http://tw.wingwit.com/Article/os/xtgl/201311/9284.html