CREATE TABLE (Transact-SQL)
在 SQL Server 中建立新的資料表。
適用於:SQL Server (SQL Server 2008 到目前的版本)。 如需 Azure SQL Database語法,請參閱<CREATE TABLE (Azure SQL Database)>。 |
語法
--Disk-Based CREATE TABLE Syntax
CREATE TABLE
[ database_name . [ schema_name ] . | schema_name . ] table_name
[ AS FileTable ]
( { <column_definition> | <computed_column_definition>
| <column_set_definition> | [ <table_constraint> ]
| [ <table_index> ] [ ,...n ] } )
[ ON { partition_scheme_name ( partition_column_name ) | filegroup
| "default" } ]
[ { TEXTIMAGE_ON { filegroup | "default" } ]
[ FILESTREAM_ON { partition_scheme_name | filegroup
| "default" } ]
[ WITH ( <table_option> [ ,...n ] ) ]
[ ; ]
<column_definition> ::=
column_name <data_type>
[ FILESTREAM ]
[ COLLATE collation_name ]
[ SPARSE ]
[ NULL | NOT NULL ]
[
[ CONSTRAINT constraint_name ] DEFAULT constant_expression ]
| [ IDENTITY [ ( seed,increment ) ] [ NOT FOR REPLICATION ]
]
[ ROWGUIDCOL ]
[ <column_constraint> [ ...n ] ]
[ <column_index> ]
<data type> ::=
[ type_schema_name . ] type_name
[ ( precision [ , scale ] | max |
[ { CONTENT | DOCUMENT } ] xml_schema_collection ) ]
<column_constraint> ::=
[ CONSTRAINT constraint_name ]
{ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[
WITH FILLFACTOR = fillfactor
| WITH ( < index_option > [ , ...n ] )
]
[ ON { partition_scheme_name ( partition_column_name )
| filegroup | "default" } ]
| [ FOREIGN KEY ]
REFERENCES [ schema_name . ] referenced_table_name [ ( ref_column ) ]
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
}
<column_index> ::=
INDEX index_name [ CLUSTERED | NONCLUSTERED ]
[ WITH ( <index_option> [ ,... n ] ) ]
[ ON { partition_scheme_name (column_name )
| filegroup_name
| default
}
]
[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
<computed_column_definition> ::=
column_name AS computed_column_expression
[ PERSISTED [ NOT NULL ] ]
[
[ CONSTRAINT constraint_name ]
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[
WITH FILLFACTOR = fillfactor
| WITH ( <index_option> [ , ...n ] )
]
[ ON { partition_scheme_name ( partition_column_name )
| filegroup | "default" } ]
| [ FOREIGN KEY ]
REFERENCES referenced_table_name [ ( ref_column ) ]
[ ON DELETE { NO ACTION | CASCADE } ]
[ ON UPDATE { NO ACTION } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
]
<column_set_definition> ::=
column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
< table_constraint > ::=
[ CONSTRAINT constraint_name ]
{
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
(column [ ASC | DESC ] [ ,...n ] )
[
WITH FILLFACTOR = fillfactor
|WITH ( <index_option> [ , ...n ] )
]
[ ON { partition_scheme_name (partition_column_name)
| filegroup | "default" } ]
| FOREIGN KEY
( column [ ,...n ] )
REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
< table_index > ::=
INDEX index_name [ CLUSTERED | NONCLUSTERED ] (column [ ASC | DESC ] [ ,... n ] )
[ WITH ( <index_option> [ ,... n ] ) ]
[ ON { partition_scheme_name (column_name )
| filegroup_name
| default
}
]
[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
}
<table_option> ::=
{
[DATA_COMPRESSION = { NONE | ROW | PAGE }
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ , ...n ] ) ]]
[ FILETABLE_DIRECTORY = <directory_name> ]
[ FILETABLE_COLLATE_FILENAME = { <collation_name> | database_default } ]
[ FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = <constraint_name> ]
[ FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = <constraint_name> ]
[ FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = <constraint_name> ]
}
<index_option> ::=
{
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF}
| ALLOW_PAGE_LOCKS ={ ON | OFF}
| DATA_COMPRESSION = { NONE | ROW | PAGE }
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ , ...n ] ) ]
}
<range> ::=
<partition_number_expression> TO <partition_number_expression>
--Memory optimized CREATE TABLE Syntax
CREATE TABLE
[database_name . [schema_name ] . | schema_name . ] table_name
( { <column_definition>
| [ <table_constraint> ] [ ,... n ]
| [ <table_index> ] [ ,... n ]
} )
[ WITH ( <table_option> [ ,... n ] ) ]
[ ; ]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
[
[ CONSTRAINT constraint_name ] DEFAULT memory_optimized_constant_expression ]
| [ IDENTITY [ ( 1, 1 ) ]
]
[ <column_constraint> ]
[ <column_index> ]
<data type> ::=
[type_schema_name . ] type_name [ (precision [ , scale ]) ]
<column_constraint> ::=
[ CONSTRAINT constraint_name ]
{ PRIMARY KEY { NONCLUSTERED HASH WITH (BUCKET_COUNT = bucket_count) | NONCLUSTERED } }
< table_constraint > ::=
[ CONSTRAINT constraint_name ]
{ PRIMARY KEY { { NONCLUSTERED HASH (column [ ,... n ] ) WITH (BUCKET_COUNT = bucket_count) | NONCLUSTERED (column [ ASC | DESC ] [ ,... n ] ) } }
<column_index> ::=
INDEX index_name
{ [ NONCLUSTERED ] HASH WITH (BUCKET_COUNT = bucket_count) | [ NONCLUSTERED ] }
<table_index> ::=
INDEX index_name
{ [ NONCLUSTERED ] HASH (column [ ,... n ] ) WITH (BUCKET_COUNT = bucket_count) | [ NONCLUSTERED ] (column [ ASC | DESC ] [ ,... n ] ) }
<table_option> ::=
{
[MEMORY_OPTIMIZED = {ON | OFF}]
| [DURABILITY = {SCHEMA_ONLY | SCHEMA_AND_DATA}]
}
引數
database_name
資料表據以建立之資料庫的名稱。 database_name 必須指定現有資料庫的名稱。 如果未指定,database_name 便預設為目前的資料庫。 目前連接的登入必須與 database_name 指定的資料庫中現有的使用者識別碼有關聯,且這個使用者識別碼必須具有 CREATE TABLE 權限。schema_name
這是新的資料表所屬的結構描述名稱。table_name
這是新資料表的名稱。 資料表名稱必須遵照識別碼的規則。 table_name 最多可有 128 個字元,但本機暫存資料表名稱 (名稱前附加一個數字符號 (#)) 除外,其不可超過 116 個字元。AS FileTable
將新資料表建立為 FileTable。 因為 FileTable 有固定的結構描述,所以您不必指定資料行。 如需有關 FileTable 的詳細資訊,請參閱<FileTable (SQL Server)>。column_name
computed_column_expression
這是定義計算資料行值的運算式。 計算資料行是一個虛擬資料行,除非資料行標示了 PERSISTED,否則,並未實際儲存在資料表中。 這個資料行是從使用相同資料表之其他資料行的運算式得出的。 例如,計算資料行的定義可能是:成本 AS 價格 * 數量。 這個運算式可以是非計算的資料行名稱、常數、函數、變數,以及一個或多個運算子所連接的這些項目的任何組合。 這個運算式不能是子查詢,也不能包含別名資料類型。計算資料行可用在選取清單、WHERE 子句、ORDER BY 子句中,或任何能夠使用規則運算式的其他位置中,但下列狀況例外:
計算資料行必須標示為 PERSISTED,才能參與 FOREIGN KEY 或 CHECK 條件約束。
如果以決定性的運算式定義計算資料行的值,而且索引資料行允許結果的資料類型,則計算資料行可以用來做為索引的索引鍵資料行,或任何 PRIMARY KEY 或 UNIQUE 條件約束的一部分。
例如,如果資料表有整數資料行 a 和 b,您可以建立計算資料行 a+b 的索引,但不能建立計算資料行 a+DATEPART(dd, GETDATE()) 的索引,因為在後續叫用時,值可能會改變。
計算資料行不能是 INSERT 或 UPDATE 陳述式的目標。
注意
對於計算資料行所涉及的資料行,資料表中的每個資料列都可能有不同的值;因此,每個資料列的計算資料行可能各有不同的值。
Database Engine 會依據所用的運算式,來自動判斷計算資料行的 Null 屬性。 大部分運算式的結果都會視為可為 Null,即使只存在不可為 Null 的資料行也是如此,這是因為可能出現的反向溢位或溢位也會產生 NULL 結果。 請搭配 AllowsNull 屬性使用 COLUMNPROPERTY 函數來調查資料表中任何計算資料行的 Null 屬性。 您可以利用 check_expression 常數來指定 ISNULL,將可為 Null 的運算式變成不可為 Null,其中常數是用來替代任何 NULL 結果的非 Null 值。 以 Common Language Runtime (CLR) 使用者定義型別運算式為基礎的計算資料行,需要類型的 REFERENCES 權限。
PERSISTED
指定 SQL Server Database Engine 會實際將計算值儲存在資料表中,以及在計算資料行所依賴的任何其他資料行有了更新時,也會更新這些值。 將計算資料行標示為 PERSISTED,可讓您在具決定性但不精確的計算資料行上建立索引。 如需詳細資訊,請參閱<計算資料行的索引>。 任何用為分割資料表之分割資料行的計算資料行,皆須明確標示為 PERSISTED。 指定 PERSISTED 時,也必須指定 computed_column_expression。ON { <partition_scheme> | filegroup | "default" }
指定儲存資料表的分割區配置或檔案群組。 如果有指定 <partition_scheme>,資料表便是一份分割區資料表,其分割區儲存在 <partition_scheme> 指定的一個或多個檔案群組所組成的檔案群組集中。 如果指定了 filegroup,資料表會儲存在具名檔案群組中。 檔案群組必須在資料庫內。 如果指定了 "default",或完全未指定 ON,資料表就會儲存在預設檔案群組中。 CREATE TABLE 所指定的資料表儲存機制無法進行後續的改變。ON {<分割區配置> | filegroup | PRIMARY KEY 或 UNIQUE 條件約束中也可指定 "default"}。 這些條件約束會建立索引。 如果指定了 filegroup,索引會儲存在具名檔案群組中。 如果指定了 "default",或完全未指定 ON,索引就會儲存在資料表的相同檔案群組中。 如果 PRIMARY KEY 或 UNIQUE 條件約束建立叢集索引,資料表的資料頁面會儲存在索引的相同檔案群組中。 如果指定了 CLUSTERED,或常數建立了叢集索引,就會指定不同於資料表定義的 <partition_scheme> 或 filegroup 之 <partition_scheme>,反之亦然,此時只會遵守常數定義,其他一概予以忽略。
注意
在此內容中,default 不是關鍵字。它是預設檔案群組的識別碼,必須加以分隔,例如 ON "default" 或 ON [default]。如果指定了 "default",目前工作階段的 QUOTED_IDENTIFIER 選項就必須是 ON。這是預設值。如需詳細資訊,請參閱<SET QUOTED_IDENTIFIER (Transact-SQL)>。
注意
在您建立分割區資料表之後,請考慮將資料表的 LOCK_ESCALATION 選項設定為 AUTO。如此一來可以讓鎖定從資料表擴大至分割區 (HoBT) 階層,進而改善並行作業。如需詳細資訊,請參閱<ALTER TABLE (Transact-SQL)>。
TEXTIMAGE_ON { filegroup| "default" }
指示 text、ntext、image、 xml、varchar(max)、 nvarchar(max)、 varbinary(max)、及 CLR 使用者自訂類型資料行(包含幾何及地理位置) ,儲存在指定的檔案群組。如果資料表中沒有大數值資料行,即不可使用 TEXTIMAGE_ON。 如果有指定 <partition_scheme>,便不能指定 TEXTIMAGE_ON。 如果指定了 "default",或完全未指定 TEXTIMAGE_ON,大數值資料行就會儲存在預設檔案群組中。 CREATE TABLE 所指定的任何大數值資料行的儲存體,無法進行後續的改變。
注意
在此內容中,default 不是關鍵字。它是預設檔案群組的識別碼,必須加以分隔,如 TEXTIMAGE_ON "default" 或 TEXTIMAGE_ON [default]。如果指定了 "default",目前工作階段的 QUOTED_IDENTIFIER 選項就必須是 ON。這是預設值。如需詳細資訊,請參閱<SET QUOTED_IDENTIFIER (Transact-SQL)>。
FILESTREAM_ON { partition_scheme_name | filegroup | "default" }
為 FILESTREAM 資料指定檔案群組。如果此資料表包含 FILESTREAM 資料,而且資料表已分割,則必須包含 FILESTREAM_ON 子句,而且必須指定 FILESTREAM 檔案群組的分割區配置。 這個分割區配置必須與資料表的分割區配置使用相同的分割區函數和分割區資料行。否則,就會引發錯誤。
如果此資料表未分割,FILESTREAM 資料行將無法分割。 此資料表的 FILESTREAM 資料必須儲存在單一檔案群組內。 這個檔案群組是在 FILESTREAM_ON 子句中指定。
如果此資料表未分割,而且沒有指定 FILESTREAM_ON 子句,就會使用具有 DEFAULT 屬性集的 FILESTREAM 檔案群組。 如果沒有任何 FILESTREAM 檔案群組,就會引發錯誤。
如同 ON 和 TEXTIMAGE_ON,使用 FILESTREAM_ON 的 CREATE TABLE 所設定的值無法變更,但下列情況除外:
CREATE INDEX 陳述式會將堆積轉換成叢集索引。 在此情況中,您就可以指定不同的 FILESTREAM 檔案群組、分割區配置或 NULL。
DROP INDEX 陳述式會將叢集索引轉換成堆積。 在此情況中,您就可以指定不同的 FILESTREAM 檔案群組、分割區配置或 "default"。
FILESTREAM_ON <filegroup> 子句中的檔案群組或在分割區配置中指定的每個 FILESTREAM 檔案群組都必須具有一個針對該檔案群組定義的檔案。 您必須使用 CREATE DATABASE 或 ALTER DATABASE 陳述式來定義這個檔案。否則,就會引發錯誤。
如需相關的 FILESTREAM 主題,請參閱<二進位大型物件 (Blob) 資料 (SQL Server)>。
[ type_schema_name**.** ] type_name
指定資料行的資料類型及其所屬的結構描述。 針對磁碟基礎的資料表,資料類型可以是下列其中一項:系統資料類型。
依據 SQL Server 系統資料類型的別名資料類型。 別名資料類型是利用 CREATE TYPE 陳述式建立的,在這之後才能在資料表定義中使用它們。 在 CREATE TABLE 陳述式期間,可以覆寫別名資料類型的 NULL 或 NOT NULL 指派。 不過,長度規格不能變更;在 CREATE TABLE 陳述式中,不能指定別名資料類型的長度。
CLR 使用者定義型別。 CLR 使用者定義型別是利用 CREATE TYPE 陳述式來建立的,之後,才能在資料表定義中使用它們。 若要建立 CLR 使用者定義型別的資料行,便需要類型的 REFERENCES 權限。
如果未指定 type_schema_name,SQL Server Database Engine 會依照下列順序來參考 type_name:
SQL Server 系統資料類型。
目前資料庫中之目前使用者的預設結構描述。
目前資料庫中的 dbo 結構描述。
針對記憶體最佳化資料表,請參閱<支援的資料類型>以取得支援的系統類型清單。
precision
這是指定之資料類型的有效位數。 如需有關有效位數值的詳細資訊,請參閱<有效位數、小數位數和長度>。scale
這是指定資料類型的小數位數。 如需有關有效小數位數值的詳細資訊,請參閱<有效位數、小數位數和長度>。max
只適合 varchar、nvarchar 和 varbinary 等資料類型用來儲存 2^31 位元組的字元和二進位資料,以及 2^30 位元組的 Unicode 資料。CONTENT
指定 column_name 中 xml 資料類型的每個執行個體都可以包含多個最上層元素。 CONTENT 只適用於 xml 資料類型,而且只有在同時指定 xml_schema_collection 時,才能指定。 若未指定,CONTENT 便是預設行為。DOCUMENT
指定 column_name 中 xml 資料類型的每個執行個體都只能包含一個最上層元素。 DOCUMENT 只適用於 xml 資料類型,而且只有在同時指定 xml_schema_collection 時,才能指定。xml_schema_collection
只適合 xml 資料類型用來將 XML 結構描述集合關聯於類型。 在結構描述中輸入 xml 資料行之前,必須先利用 CREATE XML SCHEMA COLLECTION,在資料庫中建立結構描述。DEFAULT
指定在插入期間未明確提供值時,提供給資料行的值。 除了定義為 timestamp 或含有 IDENTITY 屬性的資料行之外,任何資料行都可以套用 DEFAULT 定義。 如果使用者定義型別資料行指定了預設值,類型應該支援將 constant_expression 隱含地轉換成使用者定義型別。 當卸除資料表時,便會移除 DEFAULT 定義。 預設值只能使用常數值 (例如字元字串)、純量函數 (系統函數、使用者自訂函數或 CLR 函數) 或 NULL。 若要維護與舊版 SQL Server 的相容性,您可以將條件約束名稱指派給 DEFAULT。constant_expression
這是用來做為資料行預設值的常數、NULL 或系統函數。memory_optimized_constant_expression
這是支援用來做為資料行預設值的常數、NULL 或系統函數。 必須在原生編譯的預存程序中受到支援。 如需原生編譯的預存程序中內建函式的詳細資訊,請參閱<原生編譯的預存程序中支援的建構>。IDENTITY
指出新資料行是識別欄位。 當新資料列加入資料表時,Database Engine 會提供資料行的唯一累加值。 識別欄位通常用來搭配 PRIMARY KEY 條件約束一起使用,做為資料表的唯一資料列識別碼。 IDENTITY 屬性可以指派給 tinyint、smallint、int、bigint、decimal(p,0) 或 numeric(p,0) 等資料行。 每份資料表都只能建立一個識別欄位。 繫結的預設值和 DEFAULT 條件約束無法搭配識別欄位使用。 您必須同時指定種子和遞增,或同時不指定這兩者。 如果同時不指定這兩者,預設值便是 (1,1)。在記憶體最佳化資料表中,seed 和 increment 唯一允許的值為 1;(1,1) 是 seed 和 increment 的預設值。
seed
這是載入資料表的第一個資料列所用的值。increment
這是加入先前載入的資料列之識別值的累加值。NOT FOR REPLICATION
在 CREATE TABLE 陳述式中,IDENTITY 屬性、FOREIGN KEY 條件約束和 CHECK 條件約束,都可以指定 NOT FOR REPLICATION 子句。 如果 IDENTITY 屬性指定了這個子句,當複寫代理程式執行插入時,值不會在識別欄位中累加。 如果條件約束指定了這個子句,當複寫代理程式執行插入、更新或刪除作業時,不會強制執行這個條件約束。ON partition_scheme_name**(column_name)**
指定分割區配置來定義要做為分割區索引之分割區對應目標的檔案群組。 分割區配置必須存在於資料庫中,其方式是執行 CREATE PARTITION SCHEME 或 ALTER PARTITION SCHEME。 column_name 會指定分割區索引將進行分割的資料行。 此資料行必須符合 partition_scheme_name 所使用之分割區函數引數的資料類型、長度與有效位數。 column_name 不限定為索引定義中的資料行。 可以指定基底資料表中的任何資料行,但在分割 UNIQUE 索引時則必須從做為唯一索引鍵的資料行選擇 column_name。 這項限制可讓 Database Engine 只在單一分割區內驗證索引鍵值的唯一性。注意
當您分割一個非唯一的叢集索引時,如果尚未指定分割區資料行,依預設,Database Engine 會將它加入至叢集索引鍵清單。當您分割一個非唯一的非叢集索引時,如果尚未指定分割區資料行,Database Engine 會將它新增為索引的非索引鍵 (內含) 資料行。
如果未指定 partition_scheme_name 或 filegroup,且已分割資料表,則會利用相同的分割區資料行,將索引放在與基礎資料表相同的分割區配置中。
注意
您無法在 XML 索引上指定分割區配置。如果基底資料表已分割,XML 索引會使用與資料表相同的分割區配置。
如需有關分割區索引的詳細資訊,請參閱<分割資料表與索引>。
ON filegroup_name
在指定的檔案群組上建立指定的索引。 如果未指定位置,且資料表或檢視表未分割,則索引會使用與基礎資料表或檢視表相同的檔案群組。 此檔案群組必須已存在。ON "default"
在預設的檔案群組上建立指定的索引。在這個內容中,default 這個字不是關鍵字。 它是預設檔案群組的識別碼,必須加以分隔,例如 ON "default" 或 ON [default]。 如果指定了 "default",目前工作階段的 QUOTED_IDENTIFIER 選項就必須是 ON。 這是預設值。 如需詳細資訊,請參閱<SET QUOTED_IDENTIFIER (Transact-SQL)>。
[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
指定在建立叢集索引時,資料表之 FILESTREAM 資料的位置。 FILESTREAM_ON 子句允許將 FILESTREAM 資料移到不同的 FILESTREAM 檔案群組或分割區配置。filestream_filegroup_name 是 FILESTREAM 檔案群組的名稱。 此檔案群組必須有一個針對此檔案群組定義的檔案 (其方式是使用 CREATE DATABASE 或 ALTER DATABASE 陳述式),否則會引發錯誤。
如果分割此資料表,則必須包含 FILESTREAM_ON 子句,而且必須指定 FILESTREAM 檔案群組的分割區配置,此配置會使用與資料表之分割區配置相同的分割區函數和分割區資料行。 否則,就會引發錯誤。
如果此資料表未分割,FILESTREAM 資料行將無法分割。 此資料表的 FILESTREAM 資料必須儲存在 FILESTREAM_ON 子句中指定的單一檔案群組內。
如果正在建立叢集索引,而且此資料表不包含 FILESTREAM 資料行,則可以在 CREATE INDEX 陳述式內指定 FILESTREAM_ON NULL。
如需詳細資訊,請參閱<FILESTREAM (SQL Server)>。
ROWGUIDCOL
指出新資料行是一個資料列 GUID 資料行。 每份資料表都只能有一個 uniqueidentifier 資料行指定為 ROWGUIDCOL 資料行。 套用 ROWGUIDCOL 屬性後便可以利用 $ROWGUID 來參考資料行。 ROWGUIDCOL 屬性只能指派給 uniqueidentifier 資料行。 使用者定義資料類型資料行不能用 ROWGUIDCOL 來指定。ROWGUIDCOL 屬性不會強制執行資料行中所儲存之值的唯一性。 它也不會自動為插入資料表中的新資料列產生值。 若要產生每個資料行的唯一值,請在 INSERT 陳述式上使用 NEWID 或 NEWSEQUENTIALID 函數,或利用這些函數當做資料行的預設值。
SPARSE
指出此資料行是疏鬆資料行。 疏鬆資料行的儲存體會針對 Null 值最佳化。 疏鬆資料行無法指定為 NOT NULL。 如需有關疏鬆資料行的其他限制和詳細資訊,請參閱<使用疏鬆資料行>。FILESTREAM
僅適用於 varbinary(max) 資料行。 指定 varbinary(max) BLOB 資料的 FILESTREAM 儲存體。此資料表也必須要有具有 ROWGUIDCOL 屬性之 uniqueidentifier 資料類型的資料行。 這個資料行不能允許 null 值,且必須具有 UNIQUE 或 PRIMARY KEY 單一資料行條件約束。 資料行的 GUID 值必須在插入資料時由應用程式提供,或是由使用 NEWID () 函數的 DEFAULT 條件約束所提供。
ROWGUIDCOL 資料行無法卸除,而且當資料表有定義 FILESTREAM 資料行時,無法變更相關的條件約束。 只有當最後一個 FILESTREAM 資料行卸除之後,才可卸除 ROWGUIDCOL 資料行。
當有針對資料行指定 FILESTREAM 儲存屬性時,該資料行的所有值都會儲存在檔案系統的 FILESTREAM 資料容器內。
COLLATE collation_name
指定資料行的定序。 定序名稱可以是 Windows 定序名稱,也可以是 SQL 定序名稱。 collation_name 僅適用於 char、varchar、text、nchar、nvarchar 及 ntext 資料類型的資料行。 若未指定,當資料行是使用者自訂資料類型時,便會將使用者自訂資料類型的定序指派給這個資料行,否則,便會指派資料庫的預設定序。如需有關 Windows 和 SQL 定序名稱的詳細資訊,請參閱<Windows 定序名稱>和<SQL 定序名稱>。
如需有關 COLLATE 子句的詳細資訊,請參閱<COLLATE (Transact-SQL)>。
CONSTRAINT
這是一個選擇性的關鍵字,用來指示開始定義 PRIMARY KEY、NOT NULL、UNIQUE、FOREIGN KEY 或 CHECK 條件約束。constraint_name
這是條件約束的名稱。 在資料表所屬的結構描述內,條件約束名稱必須是唯一的。NULL | NOT NULL
決定資料行中是否允許使用 NULL 值。 嚴格來說,NULL 並不算是條件約束,但是您可以如同指定 NOT NULL 一樣加以指定。 只有在也指定了 PERSISTED 時,計算資料行才能指定 NOT NULL。PRIMARY KEY
這是一個條件約束,它利用唯一索引來強制執行一個或多個指定資料行的實體完整性。 每份資料表都只能建立一個 PRIMARY KEY 條件約束。UNIQUE
這是一項條件約束,它透過唯一索引為指定的一個或多個資料行提供實體完整性。 一份資料表可以有多個 UNIQUE 條件約束。CLUSTERED | NONCLUSTERED
指出針對 PRIMARY KEY 或 UNIQUE 條件約束建立叢集或非叢集索引。 PRIMARY KEY 條件約束預設為 CLUSTERED,UNIQUE 條件約束預設為 NONCLUSTERED。在 CREATE TABLE 陳述式中,您只能將 CLUSTERED 指定給單一條件約束。 如果 UNIQUE 條件約束指定了 CLUSTERED,且也指定了 PRIMARY KEY 條件約束,PRIMARY KEY 便預設為 NONCLUSTERED。
下列範例顯示如何在磁碟資料表中使用 NONCLUSTERED:
CREATE TABLE t1 ( c1 int, INDEX ix_1 NONCLUSTERED (c1)) CREATE TABLE t2( c1 int INDEX ix_1 NONCLUSTERED (c1)) CREATE TABLE t3( c1 int, c2 int INDEX ix_1 NONCLUSTERED) CREATE TABLE t4( c1 int, c2 int, INDEX ix_1 NONCLUSTERED (c1,c2))
FOREIGN KEY REFERENCES
這是一個條件約束,它提供一個或多個資料行中之資料的參考完整性。 FOREIGN KEY 條件約束要求資料行中的每個值存在於所參考之資料表中的一個或多個對應的被參考資料行中。 FOREIGN KEY 條件約束所參考的資料行,必須是所參考的資料表中的 PRIMARY KEY 或 UNIQUE 條件約束,或是所參考的資料表之 UNIQUE INDEX 中所參考的資料行。 計算資料行的外部索引鍵也必須標示為 PERSISTED。[ schema_name**.**] referenced_table_name]
這是 FOREIGN KEY 條件約束所參考之資料表的名稱,及其所屬的結構描述。( ref_column [ ,... n ] )
這是 FOREIGN KEY 條件約束所參考之資料表中的某資料行或資料行清單。ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
指定如果建立的資料表中之資料列有參考關聯性,且在父資料表中刪除了所參考的資料列,建立的資料表中之資料列會發生什麼動作。 預設值是 NO ACTION。NO ACTION
Database Engine 會產生一則錯誤,且會回復父資料表中之資料列的刪除動作。CASCADE
如果從父資料表中刪除資料列,便會從進行參考的資料表中刪除對應的資料列。SET NULL
如果刪除父資料表中對應的資料列,所有組成外部索引鍵的值都會設為 NULL。 若要執行這個條件約束,外部索引鍵資料行必須可為 Null。SET DEFAULT
如果刪除父資料表中對應的資料列,所有組成外部索引鍵的值都會設為預設值。 若要執行這個條件約束,所有外部索引鍵資料行都必須有預設定義。 如果有可為 Null 的資料行,但沒有設定明確的預設值,NULL 便成為這個資料行的隱含預設值。
如果資料表要包含在使用邏輯記錄的合併式發行集中,請勿指定 CASCADE。 如需有關邏輯記錄的詳細資訊,請參閱<使用邏輯記錄分組相關資料列的變更>。
如果資料表已有 INSTEAD OF 觸發程序 ON DELETE,便無法定義 ON DELETE CASCADE。
例如,在 AdventureWorks2012 資料庫中,ProductVendor 資料表與 Vendor 資料表有參考關聯性。 ProductVendor.BusinessEntityID 外部索引鍵會參考 Vendor.BusinessEntityID 主索引鍵。
如果在 Vendor 資料表的某個資料列上執行 DELETE 陳述式,且指定了 ProductVendor.BusinessEntityID 的 ON DELETE CASCADE 動作,Database Engine 便會檢查 ProductVendor 資料表中的一個或多個相依資料列。 如果有任何相依的資料列存在,就會刪除 ProductVendor 資料表中的相依資料列,以及 Vendor 資料表中所參考的資料列。
相反地,如果指定了 NO ACTION,且 ProductVendor 資料表中有至少一個資料列參考 Vendor 資料列,Database Engine 便會產生一則錯誤,且會回復該資料列的刪除動作。
ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
指定當變更的資料表中之資料列有參考關聯性,且在父資料表中所參考的資料列有了更新時,變更的資料表中之資料列會發生什麼動作。 預設值是 NO ACTION。NO ACTION
Database Engine 會產生一則錯誤,且會回復父資料表中之資料列的更新動作。CASCADE
當父資料表中的資料列有了更新時,在進行參考的資料表中,也會更新對應的資料列。SET NULL
當更新父資料表中對應的資料列時,所有組成外部索引鍵的值都會設為 NULL。 若要執行這個條件約束,外部索引鍵資料行必須可為 Null。SET DEFAULT
當更新父資料表中對應的資料列時,所有組成外部索引鍵的值都會設為預設值。 若要執行這個條件約束,所有外部索引鍵資料行都必須有預設定義。 如果有可為 Null 的資料行,但沒有設定明確的預設值,NULL 便成為這個資料行的隱含預設值。
如果資料表要包含在使用邏輯記錄的合併式發行集中,請勿指定 CASCADE。 如需有關邏輯記錄的詳細資訊,請參閱<使用邏輯記錄分組相關資料列的變更>。
如果在 INSTEAD OF 觸發程序 ON UPDATE 已經存在已警示的資料表,則無法定義ON UPDATE CASCADE、SET NULL、或 SET DEFAULT。
例如在 AdventureWorks2012 資料庫中,ProductVendor 資料表與 Vendor 資料表有參考關聯性。ProductVendor.BusinessEntity 外部索引鍵會參考 Vendor.BusinessEntityID 主索引鍵。
如果在 Vendor 資料表的某資料列上執行 UPDATE 陳述式,且指定了 ProductVendor.BusinessEntityID 的 ON UPDATE CASCADE 動作,Database Engine 便會檢查 ProductVendor 資料表中一個或多個相依的資料列。 如果有任何相依的資料列存在,就會更新 ProductVendor 資料表中的相依資料列,以及 Vendor 資料表中所參考的資料列。
相反地,如果指定了 NO ACTION,且 ProductVendor 資料表中有至少一個資料列參考 Vendor 資料列,Database Engine 便會產生一則錯誤,且會回復 Vendor 資料列的更新動作。
CHECK
這是一個條件約束,藉由限制可能輸入一個或多個資料行的值,強制執行範圍完整性。 計算資料行的 CHECK 條件約束也必須標示 PERSISTED。logical_expression
這是一個傳回 TRUE 或 FALSE 的邏輯運算式。 這個運算式不能含有別名資料類型。column
這是資料表條件約束中的一個資料行或一份資料行清單 (用括號括住),用來指示條件約束定義中所用的各個資料行。[ ASC | DESC ]
指定一個或多個資料行參與資料表條件約束的排序順序。 預設值是 ASC。partition_scheme_name
這是分割區配置的名稱,這個分割區配置定義了分割區資料表的分割區所對應的檔案群組。 分割區配置必須在資料庫內。[ partition_column_name**.** ]
指定分割區資料表將進行分割的資料行。 這個資料行必須符合 partition_scheme_name 使用的分割區函數所指定之資料行的資料類型、長度和有效位數。 參與分割區函數的計算資料行必須明確地標示為 PERSISTED。重要事項 我們建議您在分割區資料表的分割資料行上指定 NOT NULL,以及在非分割區資料表 (ALTER TABLE...SWITCH 作業的來源或目標) 上進行這項作業。這樣做可以確保分割資料行上的任何 CHECK 條件約束都不需要檢查 Null 值。
WITH FILLFACTOR **=**fillfactor
指定用來儲存索引資料的每個索引頁面,Database Engine 所應加以填滿的程度。 使用者指定的 fillfactor 值可以從 1 到 100。 如果未指定值,預設值為 0。 填滿因數值 0 和 100 在各方面都是一樣的。重要事項 維護 WITH FILLFACTOR = fillfactor 是 PRIMARY KEY 或 UNIQUE 條件約束所適用之唯一索引選項的文件說明,是為了與舊版相容,但未來版本的文件不會再依照這個方式來說明。
column_set_nameXML COLUMN_SET FOR ALL_SPARSE_COLUMNS
這是資料行集的名稱。 資料行集是不具類型的 XML 表示,可將資料表的所有疏鬆資料行結合到結構化輸出中。 如需有關資料行集的詳細資訊,請參閱<使用資料行集>。< table_option> ::=
指定一個或多個資料表選項。 MEMORY_OPTIMIZED = OFF 和 DURABILITY = SCHEMA_AND_DATA 也可以指定給非記憶體最佳化資料表。DATA_COMPRESSION
針對指定的資料表、分割區編號或分割區範圍指定資料壓縮選項。 選項如下:NONE
不壓縮資料表或指定的分割區。ROW
使用資料列壓縮來壓縮資料表或指定的分割區。PAGE
使用頁面壓縮來壓縮資料表或指定的分割區。
如需有關壓縮的詳細資訊,請參閱<資料壓縮>。
ON PARTITIONS ( { <partition_number_expression> | <range> } [ ,...n ] )
指定套用 DATA_COMPRESSION 設定的分割區。 如果未分割此資料表,ON PARTITIONS 引數將會產生錯誤。 如果未提供 ON PARTITIONS 子句,DATA_COMPRESSION 選項將會套用到資料分割資料表的所有資料分割。可以使用以下方式來指定 <partition_number_expression>:
提供資料分割的資料分割編號,例如:ON PARTITIONS (2)。
為數個個別分割區提供以逗號分隔的分割區編號,例如:ON PARTITIONS (1, 5)。
同時提供範圍和個別分割區,例如:ON PARTITIONS (2, 4, 6 TO 8)。
<range> 可以指定為以 TO 一字分隔的分割區編號,例如:ON PARTITIONS (6 TO 8)。
若要為不同的分割區設定不同類型的資料壓縮,請指定 DATA_COMPRESSION 選項一次以上,例如:
WITH ( DATA_COMPRESSION = NONE ON PARTITIONS (1), DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8), DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5) )
<index_option>::=
指定一個或多個索引選項。 如需這些選項的完整描述,請參閱<CREATE INDEX (Transact-SQL)>。PAD_INDEX = { ON | OFF }
當設為 ON 時,便會在索引的中繼層級頁面上,套用 FILLFACTOR 所指定的可用空間百分比。 當設為 OFF 或未指定 FILLFACTOR 值時,考慮到中繼頁面的各組索引鍵,中繼層級頁面容量的填滿程度,會保留至少足以容納一個資料列的空間,且資料列是索引所能擁有的大小上限。 預設值為 OFF。FILLFACTOR **=**fillfactor
指定一個百分比來指出在建立或改變索引期間,Database Engine 應該使各索引頁面之分葉層級填滿的程度。 fillfactor 必須是 1 到 100 之間的整數值。 預設值是 0。 填滿因數值 0 和 100 在各方面都是一樣的。IGNORE_DUP_KEY = { ON | OFF }
指定當插入作業嘗試將重複的索引鍵值插入唯一索引時所產生的錯誤回應。 IGNORE_DUP_KEY 選項只適用於在建立或重建索引之後所發生的插入作業。 執行 CREATE INDEX、ALTER INDEX 或 UPDATE 時,這個選項沒有任何作用。 預設值為 OFF。ON
當重複的索引鍵值插入唯一索引時,就會出現警告訊息。 只有違反唯一性條件約束的資料列才會失敗。OFF
當重複的索引鍵值插入唯一索引時,就會出現錯誤訊息。 整個 INSERT 作業將會回復。
若為針對檢視表所建立的索引、非唯一索引、XML 索引、空間索引和篩選索引,IGNORE_DUP_KEY 不得設為 ON。
若要檢視 IGNORE_DUP_KEY,請使用 sys.indexes。
在與舊版本相容的語法中,WITH IGNORE_DUP_KEY 相當於 WITH IGNORE_DUP_KEY = ON。
STATISTICS_NORECOMPUTE = { ON | OFF }
當設為 ON 時,不會自動重新計算過期的索引統計資料。 當設為 OFF 時,便會啟用統計資料的自動更新。 預設值為 OFF。ALLOW_ROW_LOCKS = { ON | OFF }
當設為 ON 時,在您存取索引時,允許資料列鎖定。 Database Engine 會決定使用資料列鎖定的時機。 當設為 OFF 時,不會使用資料列鎖定。 預設值是 ON。ALLOW_PAGE_LOCKS = { ON | OFF }
當設為 ON 時,在您存取索引時,允許頁面鎖定。 Database Engine 會決定使用頁面鎖定的時機。 當設為 OFF 時,不會使用頁面鎖定。 預設值是 ON。FILETABLE_DIRECTORY = directory_name
適用於:SQL Server 2012 到 SQL Server 2014。
指定 Windows 相容的 FileTable 目錄名稱。 在資料庫的所有 FileTable 目錄名稱之間,此名稱必須是唯一的。 無論定序設定為何,唯一性比較皆不會區分大小寫。 如果未指定此值,就會使用 FileTable 的名稱。
FILETABLE_COLLATE_FILENAME = { collation_name | database_default }
適用於:SQL Server 2012 到 SQL Server 2014。
指定定序名稱,用於套用至 FileTable 中的 Name 資料行。 定序必須不區分大小寫,以符合 Windows 檔案命名語義。 如果未指定此值,就會使用資料庫預設定序。 如果資料庫預設定序區分大小寫,則會引發錯誤,而且 CREATE TABLE 作業會失敗。
collation_name
不區分大小寫的定序名稱。database_default
指定所要使用的資料庫預設定序。 此定序不可區分大小寫。
FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = constraint_name
適用於:SQL Server 2012 到 SQL Server 2014。
指定在 FileTable 上自動建立的主索引鍵條件約束所要使用的名稱。 如果未指定此值,系統就會產生條件約束的名稱。
FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = constraint_name
適用於:SQL Server 2012 到 SQL Server 2014。
指定在 FileTable 的 stream_id 資料行上自動建立的唯一條件約束所要使用的名稱。 如果未指定此值,系統就會產生條件約束的名稱。
FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = constraint_name
適用於:SQL Server 2012 到 SQL Server 2014。
指定在 FileTable 的 parent_path_locator 和 name 資料行上自動建立的唯一條件約束所要使用的名稱。 如果未指定此值,系統就會產生條件約束的名稱。
MEMORY_OPTIMIZED
適用於:SQL Server 2014 到 SQL Server 2014。
指出資料表是否為記憶體最佳化。 記憶體最佳化資料表是記憶體中的使用者資料表,其結構描述保存在磁碟上,類似於其他使用者資料表。 記憶體最佳化資料表可以從原生編譯預存程序存取。
DURABILITY
適用於:SQL Server 2014 到 SQL Server 2014。
SCHEMA_AND_DATA 的值表示資料表是持久、記憶體最佳化資料表。 DURABILITY=SCHEMA_AND_DATA 可以搭配 MEMORY_OPTIMIZED=OFF 使用。 SCHEMA_AND_DATA 是記憶體最佳化資料表的預設值。
SCHEMA_ONLY 的值表示資料表是非持久的。 資料表結構描述會保存,但是在具有記憶體最佳化物件的資料庫重新啟動時,任何資料更新都不會保存。 DURABILITY=SCHEMA_ONLY 不可搭配 MEMORY_OPTIMIZED=OFF 使用。
警告
當資料表是以 DURABILITY = SCHEMA_ONLY 建立,而且後續使用 ALTER DATABASE 變更 READ_COMMITTED_SNAPSHOT 時,資料將會遺失。
DURABILITY 引數不適用於資料表類型,這是可以從中宣告資料表變數或資料表值參數的類型。 使用記憶體最佳化資料表類型所宣告的變數,根據定義為非持久的。
BUCKET_COUNT
適用於:SQL Server 2014 到 SQL Server 2014。
指出應該在雜湊索引中建立的貯體數目。 雜湊索引中 BUCKET_COUNT 的最大值是 1,073,741,824。 如需有關值區計數的詳細資訊,請參閱<判斷雜湊索引的正確值區計數>。
Bucket_count 是必要的引數。
INDEX
適用於:SQL Server 2014 到 SQL Server 2014。
您必須指定資料行和資料表索引,做為 CREATE TABLE 陳述式的一部分。 記憶體最佳化資料表不支援 CREATE INDEX 和 DROP INDEX。
HASH
適用於:SQL Server 2014 到 SQL Server 2014。
表示已建立雜湊索引。
只有記憶體最佳化資料表才支援雜湊索引。
備註
如需有關允許的資料表、資料行、條件約束及索引數目的詳細資訊,請參閱<SQL Server 的最大容量規格>。
空間通常會以每次一個範圍的遞增方式配置給資料表及索引。 當建立資料表或索引時,會從混合範圍配置資料表或索引的頁面,直到它的頁面足以填滿一個統一範圍為止。 在它有足以填滿統一範圍的頁面之後,每當目前配置的範圍已滿之後,便會配置另一個範圍。 如需資料表所配置和使用之空間量的報表,請執行 sp_spaceused。
Database Engine 不會強制在資料行定義中指定 DEFAULT、IDENTITY、ROWGUIDCOL 或資料行條件約束的順序。
當建立資料表時,一律會在資料表的中繼資料中將 QUOTED IDENTIFIER 選項儲存成 ON,即使建立資料表時,將選項設成 OFF,也是如此。
暫存資料表
您可以建立本機和全域暫存資料表。 本機暫存資料表只在目前工作階段中才可以看見,全域暫存資料表則是所有工作階段都能夠看見。 暫存資料表不能進行分割。
請用一個數字符號來做為本機暫存資料表名稱的前置詞 (#table_name),用兩個數字符號做為全域暫存資料表名稱的前置詞 (##table_name)。
SQL 陳述式會利用 CREATE TABLE 陳述式中指定給 table_name 的值來參考暫存資料表,例如:
CREATE TABLE #MyTempTable (cola INT PRIMARY KEY);
INSERT INTO #MyTempTable VALUES (1);
如果在單一預存程序或批次內,建立了多個暫存資料表,它們必須有不同的名稱。
如果本機暫存資料表建立在多位使用者可以同時執行的預存程序或應用程式中,Database Engine 必須能夠區分不同使用者所建立的資料表。 Database Engine 會在內部將數值後置詞附加至每個本機暫存資料表名稱上,以便區分它們。 tempdb 內的 sysobjects 資料表所儲存的暫存資料表完整名稱,由 CREATE TABLE 陳述式所指定的資料表名稱和系統產生的數值後置詞組成。 為了允許後置詞,指定給本機暫存名稱的 table_name 不能超出 116 個字元。
除非利用 DROP TABLE 來明確卸除暫存資料表,否則,暫存資料表會在超出範圍時自動卸除:
當預存程序完成時,會自動卸除預存程序中所建立的本機暫存資料表。 建立資料表的預存程序所執行的任何巢狀預存程序,都可以參考這份資料表。 呼叫建立資料表的預存程序之處理序不能參考這份資料表。
在目前工作階段結束時,會自動卸除所有其他本機暫存資料表。
當建立全域暫存資料表的工作階段結束,且所有其他工作也都停止參考這些資料表,便會自動卸除這些全域暫存資料表。 工作和資料表之間的關聯,只在單一 Transact-SQL 陳述式的生命期間進行維護。 這表示當建立工作階段結束時,在最後一個主動參考這份資料表的 Transact-SQL 陳述式完成時,便會卸除這份全域暫存資料表。
在預存程序或觸發程序內建立的本機暫存資料表,名稱可以和呼叫這個預存程序或觸發程序之前所建立的暫存資料表相同。 不過,如果查詢參考一份暫存資料表,且同時有兩份同名的暫存資料表存在,便不會定義要針對哪一份資料表來解析這項查詢。 巢狀預存程序也可以建立與呼叫的預存程序所建立之暫存資料表同名的暫存資料表。 不過,若要將修正解析到巢狀程序中所建立的資料表,這份資料表與發出呼叫的程序所建立的資料表,必須有相同的結構和資料行名稱。 下列範例會顯示這一點。
CREATE PROCEDURE dbo.Test2
AS
CREATE TABLE #t(x INT PRIMARY KEY);
INSERT INTO #t VALUES (2);
SELECT Test2Col = x FROM #t;
GO
CREATE PROCEDURE dbo.Test1
AS
CREATE TABLE #t(x INT PRIMARY KEY);
INSERT INTO #t VALUES (1);
SELECT Test1Col = x FROM #t;
EXEC Test2;
GO
CREATE TABLE #t(x INT PRIMARY KEY);
INSERT INTO #t VALUES (99);
GO
EXEC Test1;
GO
以下為結果集:
(1 row(s) affected)
Test1Col
-----------
1
(1 row(s) affected)
Test2Col
-----------
2
當您建立本機或全域暫存資料表時,CREATE TABLE 語法會支援 FOREIGN KEY 條件約束以外的條件約束定義。 如果在暫存資料表中指定 FOREIGN KEY 條件約束,陳述式會傳回一則說明已略過條件約束的警告訊息。 這份資料表仍會建立,但不含 FOREIGN KEY 條件約束。 FOREIGN KEY 條件約束不能參考暫存資料表。
如果您使用具名條件約束來建立暫存資料表,而且在使用者定義交易的範圍內建立此暫存資料表,則一次只有一位使用者能夠執行建立暫存資料表的陳述式。 例如,如果預存程序使用了具名的主索引鍵條件約束來建立暫存資料表,此預存程序就無法同時由多位使用者執行。
分割區資料表
在利用 CREATE TABLE 來建立分割區資料表之前,您必須先建立一個分割區函數來指定資料表分割區的方式。 分割區函數是使用 CREATE PARTITION FUNCTION 建立的。 其次,您必須建立一個分割區配置來指定保留分割區函數所指示之分割區的檔案群組。 分割區配置是使用 CREATE PARTITION SCHEME 建立的。 您不能針對分割區資料表來指定將 PRIMARY KEY 或 UNIQUE 條件約束放在個別檔案群組中。 如需詳細資訊,請參閱<分割資料表與索引>。
PRIMARY KEY 條件約束
一份資料表只能有一個 PRIMARY KEY 條件約束。
PRIMARY KEY 條件約束所產生的索引,無法使資料表的索引數目超出 999 個非叢集索引和 1 個叢集索引。
如果未指定 PRIMARY KEY 條件約束的 CLUSTERED 或 NONCLUSTERED,且未指定 UNIQUE 條件約束的叢集索引,便使用 CLUSTERED。
PRIMARY KEY 條件約束內所定義的所有資料行,都必須定義成 NOT NULL。 如果未指定 Null 屬性,參與 PRIMARY KEY 條件約束的所有資料行,其 Null 屬性都會設成 NOT NULL。
如果在 CLR 使用者定義的類型資料行上定義主索引鍵,類型的實作必須支援二進位排序。 如需詳細資訊,請參閱<CLR 使用者定義型別>。
UNIQUE 條件約束
如果未指定 UNIQUE 條件約束的 NONCLUSTERED 或 NONCLUSTERED,依預設,會使用 NONCLUSTERED。
每個 UNIQUE 條件約束都會產生一個索引。 UNIQUE 條件約束數目無法使資料表的索引數目超出 999 個非叢集索引和 1 個叢集索引。
如果在 CLR 使用者定義型別資料行上定義唯一條件約束,類型的實作必須支援二進位順序或以運算子為基礎的順序。 如需詳細資訊,請參閱<CLR 使用者定義型別>。
FOREIGN KEY 條件約束
在 FOREIGN KEY 條件約束的資料行中輸入 NULL 以外的值時,值必須在參考的資料行中;否則,系統會傳回外部索引鍵違規錯誤訊息。
除非您也指定了來源資料行,否則,FOREIGN KEY 條件約束會套用在前面的資料行。
FOREIGN KEY 條件約束只能參考在相同伺服器之相同資料庫內的資料表。 跨資料庫參考完整性必須利用觸發程序來實作。 如需詳細資訊,請參閱<CREATE TRIGGER (Transact-SQL)>。
FOREIGN KEY 條件約束可以參考相同資料表中的另一個資料行。 這稱為自我參考。
資料行層級 FOREIGN KEY 條件約束的 REFERENCES 子句只能列出一個參考資料行。 這個資料行必須有定義了條件約束的資料行之相同資料類型。
資料表層級 FOREIGN KEY 條件約束的 REFERENCES 子句,必須有與條件約束資料行清單中的資料行一樣多的參考資料行。 每個參考資料行的資料類型,也必須與資料行清單中的對應資料行相同。
如果外部索引鍵或所參考的索引鍵中有 timestamp 類型的資料行,您便不能指定 CASCADE、SET NULL 或 SET DEFAULT。
您可以在相互具有參考關聯性的資料表上,組合 CASCADE、SET NULL、SET DEFAULT 和 NO ACTION。 如果 Database Engine 發現 NO ACTION,它會停止和回復相關的 CASCADE、SET NULL 和 SET DEFAULT 動作。 當 DELETE 陳述式造成 CASCADE、SET NULL、SET DEFAULT 和 NO ACTION 等動作的組合時,在 Database Engine 檢查任何 NO ACTION 之前,會先套用 CASCADE、SET NULL 及 SET DEFAULT 等動作。
在資料表所能包含參考其他資料表的 FOREIGN KEY 條件約束數目,及其他資料表所擁有參考特定資料表的 FOREIGN KEY 條件約束數目上,Database Engine 並沒有預先定義的限制。
不過,FOREIGN KEY 條件約束的實際可用數目,會受到硬體組態及資料庫和應用程式設計的限制。 建議資料表所包含的 FOREIGN KEY 條件約束數目不要超出 253 個,參考資料表的 FOREIGN KEY 條件約束數目也不要超出 253 個。 有效限制多少會隨著應用程式和硬體而不同。 當您設計資料庫和應用程式時,請考量強制執行 FOREIGN KEY 條件約束的成本。
暫存資料表不會強制執行 FOREIGN KEY 條件約束。
FOREIGN KEY 條件約束只能參考在所參考的資料表中之 PRIMARY KEY 或 UNIQUE 條件約束中的資料行,或在所參考的資料表之 UNIQUE INDEX 中的資料行。
如果在 CLR 使用者定義的類型資料行上定義外部索引鍵,類型的實作必須支援二進位順序。 如需詳細資訊,請參閱<CLR 使用者定義型別>。
加入外部索引鍵關聯性的資料行都必須定義相同的長度和小數位數。
DEFAULT 定義
資料行只能有一個 DEFAULT 定義。
DEFAULT 定義可以包含常數值、函數、SQL 標準 niladic 函數 或 NULL。 下表顯示在 INSERT 陳述式期間,niladic 函數及它們傳回的預設值。
SQL-92 niladic 函數
傳回的值
CURRENT_TIMESTAMP
目前的日期和時間。
CURRENT_USER
執行插入的使用者名稱。
SESSION_USER
執行插入的使用者名稱。
SYSTEM_USER
執行插入的使用者名稱。
USER
執行插入的使用者名稱。
DEFAULT 定義中的 constant_expression 無法參考資料表中的另一個資料行,也無法參考其他資料表、檢視表或預存程序。
您無法在含 timestamp 資料類型的資料行上,或在含 IDENTITY 屬性的資料行上建立 DEFAULT 定義。
如果別名資料類型繫結於預設物件,您便無法針對含別名資料類型的資料行來建立 DEFAULT 定義。
CHECK 條件約束
資料行可以有任意數目的 CHECK 條件約束,且條件可以包括用 AND 和 OR 組合的多個邏輯運算式。 資料行的多個 CHECK 條件約束是依照建立的順序來驗證的。
這個搜尋條件必須得出布林運算式,且不能參考其他資料表。
資料行層級 CHECK 條件約束只能參考受條件約束限制的資料行,資料表層級的 CHECK 條件約束只能參考相同資料表中的資料行。
CHECK CONSTRAINTS 和規則會在 INSERT 和 UPDATE 陳述式期間,提供相同的資料驗證功能。
當一個或多個資料行有規則和一個或多個 CHECK 條件約束存在時,會評估所有限制。
在 text、ntext 或 image 資料行上,無法定義 CHECK 條件約束。
其他條件約束資訊
您不能利用 DROP INDEX 來卸除建立給條件約束的索引;您必須利用 ALTER TABLE 來卸除條件約束。 為條件約束建立且供條件約束使用的索引,可以利用 ALTER INDEX...REBUILD 來重建。 如需詳細資訊,請參閱<重新組織與重建索引>。
條件約束名稱必須遵照識別碼的規則,不過,名稱開頭不能是數字符號 (#)。 如果未提供 constraint_name,就會將系統產生的名稱指派給條件約束。 條件約束名稱會出現在強制違規的任何錯誤訊息中。
當在 INSERT、UPDATE 或 DELETE 陳述式中違反條件約束時,陳述式便會結束。 不過,當 SET XACT_ABORT 設為 OFF 時,如果陳述式在明確的交易中,就會繼續處理交易。 當 SET XACT_ABORT 設為 ON 時,就會回復整個交易。 您也可以檢查 @@ERROR 系統功能來搭配交易定義使用 ROLLBACK TRANSACTION 陳述式。
如果 ALLOW_ROW_LOCKS = ON 且 ALLOW_PAGE_LOCK = ON,當您存取索引時,允許資料列、頁面和資料表層級的鎖定。 Database Engine 會選擇適當的鎖定,且可以將鎖定從資料列或頁面鎖定擴大到資料表鎖定。 如果 ALLOW_ROW_LOCKS = OFF 且 ALLOW_PAGE_LOCK = OFF,當您存取索引時,只允許資料表層級的鎖定。
如果資料表有 FOREIGN KEY 或 CHECK CONSTRAINTS 和觸發程序,就會先評估條件約束的條件,再執行觸發程序。
針對資料表及其資料行的報表,請使用 sp_help 或 sp_helpconstraint。 若要重新命名資料表,請使用 sp_rename。 如需相依於資料表之檢視表和預存程序的報表,請使用 sys.dm_sql_referenced_entities 和 sys.dm_sql_referencing_entities。
資料表定義內的 Null 屬性規則
資料行的 Null 屬性決定了資料行的資料是否接受 NULL 值。 NULL不是零或空白:NULL 表示沒有任何輸入,或提供了明確的 NULL;但 NULL 通常隱含了值不明或不適用的意思。
當您利用 CREATE TABLE 或 ALTER TABLE 來建立或變更資料表時,資料庫和工作階段設定會影響且可能會覆寫資料行定義所用之資料類型的 Null 屬性。 我們建議您對於非計算資料行,一律將資料行明確定義為 NULL 或 NOT NULL,如果您採用使用者自訂資料類型,建議您允許資料行使用資料類型的預設 Null 屬性。 疏鬆資料行必須永遠允許 NULL。
當您並未明確指定資料行 Null 屬性時,資料行 Null 屬性會遵照下表所顯示的規則。
資料行資料類型 |
規則 |
---|---|
別名資料型別 |
Database Engine 會使用建立資料類型時所指定的 Null 屬性。 若要判斷資料類型的預設 Null 屬性,請使用 sp_help。 |
CLR 使用者定義型別 (CLR user-defined type) |
Null 屬性取決於資料行定義。 |
系統提供的資料類型 |
如果系統提供的資料類型只有一個選項,將會優先使用。 timestamp 資料類型必須是 NOT NULL。 當利用 SET 將任何工作階段設定設為 ON 時:
|
當工作階段並未設定任何一個 ANSI_NULL_DFLT 選項,而且資料庫設為預設值 (ANSI_NULL_DEFAULT 為 OFF) 時,會指派預設值 NOT NULL。
如果資料行是計算資料行,它的 Null 屬性一律由 Database Engine 來自動決定。 若要知道這類資料行的 Null 屬性,請搭配 AllowsNull 屬性來使用 COLUMNPROPERTY 函數。
注意
SQL Server ODBC 驅動程式和 Microsoft OLE DB Provider for SQL Server 都預設為將 ANSI_NULL_DFLT_ON 設為 ON。ODBC 和 OLE DB 使用者可以在 ODBC 資料來源中設定這個項目,也可以利用應用程式所設定的連接屬性來設定這個項目。
資料壓縮
系統資料表無法啟用壓縮。 當您建立資料表時,除非另外指定,否則資料壓縮會設定為 NONE。 如果您指定資料分割清單或超出範圍的資料分割,將會產生錯誤。 如需有關資料壓縮的詳細資訊,請參閱<資料壓縮>。
若要評估變更壓縮狀態如何影響資料表、索引或分割區,請使用 sp_estimate_data_compression_savings 預存程序。
記憶體最佳化資料表
從 SQL Server 2014 開始,資料表的資料處理可以在主要記憶體中執行,而不是在磁碟上。 如需詳細資訊,請參閱<記憶體最佳化資料表>。
記憶體最佳化資料表可支援雜湊索引和記憶體最佳化非叢集索引。 記憶體最佳化資料表最多支援八個索引。 不支援動態雜湊。 如需詳細資訊,請參閱<使用記憶體最佳化資料表索引的方針>。
非持久的記憶體最佳化資料表在建立期間至少需要一個索引。 持久的記憶體最佳化資料表需要主索引鍵,供內部使用為復原索引。 索引無法加入至現有的記憶體最佳化資料表。
主索引鍵所屬的任何資料行都無法更新。
如需示範如何建立記憶體最佳化資料表的程式碼範例,請參閱<建立記憶體最佳化資料表和原生編譯的預存程序>。
Permissions
需要資料庫的 CREATE TABLE 權限以及用以建立資料表之結構描述的 ALTER 權限。
如果將 CREATE TABLE 陳述式中的任何資料行定義成 CLR 使用者定義型別,就需要類型的擁有權或它的 REFERENCES 權限。
如果 CREATE TABLE 陳述式中的任何資料行有相關聯的 XML 結構描述集合,就需要 XML 結構描述集合的擁有權或它的 REFERENCES 權限。
任何使用者都可以在 tempdb 中建立暫存資料表。
範例
A.在資料行上建立 PRIMARY KEY 條件約束
下列範例會顯示 PRIMARY KEY 條件約束的資料行定義,其中 Employee 資料表的 EmployeeID 資料行上包含叢集索引。 由於未指定條件約束名稱,因此系統會提供條件約束名稱。
CREATE TABLE dbo.Employee (EmployeeID int
PRIMARY KEY CLUSTERED);
B.使用 FOREIGN KEY 條件約束
FOREIGN KEY 條件約束用來參考另一份資料表。 外部索引鍵可以是單一資料行,也可以是多重資料行的索引鍵。 這個範例顯示參考 SalesPerson 資料表之 SalesOrderHeader 資料表的單一資料行 FOREIGN KEY 條件約束。 單一資料行 FOREIGN KEY 條件約束只需要 REFERENCES 子句。
SalesPersonID int NULL
REFERENCES SalesPerson(SalesPersonID)
另外,您也可以明確地使用 FOREIGN KEY 子句,再重新指定資料行屬性。 請注意,兩份資料表中的資料行名稱不必相同。
FOREIGN KEY (SalesPersonID) REFERENCES SalesPerson(SalesPersonID)
多重資料行索引鍵條件約束會建立成資料表條件約束。 在 AdventureWorks2012 資料庫中,SpecialOfferProduct 資料表包括一個多重資料行 PRIMARY KEY。 下列範例會顯示如何從另一份資料表參考這個索引鍵;明確的條件約束名稱是選擇性的。
CONSTRAINT FK_SpecialOfferProduct_SalesOrderDetail FOREIGN KEY
(ProductID, SpecialOfferID)
REFERENCES SpecialOfferProduct (ProductID, SpecialOfferID)
C.使用 UNIQUE 條件約束
UNIQUE 條件約束用來強制執行非主索引鍵資料行的唯一性。 下列範例會強制執行「Product 資料表的 Name 資料行必須是唯一的」這項限制。
Name nvarchar(100) NOT NULL
UNIQUE NONCLUSTERED
D.使用 DEFAULT 定義
當未提供值時,預設值會提供一個值 (利用 INSERT 和 UPDATE 陳述式)。 例如, AdventureWorks2012 資料庫可以包括一份查閱資料表,列出公司中員工能夠填入的不同作業。 在描述每項作業的資料行中,當並未明確輸入實際描述時,字元字串預設值可以提供一項描述。
DEFAULT 'New Position - title not formalized yet'
除了常數之外,DEFAULT 定義也可以包含函數。 請利用下列範例來取得項目的目前日期。
DEFAULT (getdate())
niladic 函數掃描也可以改進資料完整性。 若要追蹤插入資料列的使用者,請使用 USER 的 niladic 函數。 請勿用括號括住 niladic 函數。
DEFAULT USER
E.使用 CHECK 條件約束
下列範例會顯示輸入 Vendor 資料表 CreditRating 資料行之值的限制。 這個條件約束不具名。
CHECK (CreditRating >= 1 and CreditRating <= 5)
這個範例顯示含有在資料表資料行中輸入的字元資料之模式限制的具名條件約束。
CONSTRAINT CK_emp_id CHECK (emp_id LIKE
'[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]'
OR emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]')
這個範例指定值必須在特定清單中,或遵照指定的模式。
CHECK (emp_id IN ('1389', '0736', '0877', '1622', '1756')
OR emp_id LIKE '99[0-9][0-9]')
F.顯示完整的資料表定義
下列範例會顯示含有 AdventureWorks2012 資料庫中所建立的 PurchaseOrderDetail 資料表之所有條件約束定義的完整資料表定義。 請注意,資料表結構描述會變更為 dbo,以執行範例。
CREATE TABLE dbo.PurchaseOrderDetail
(
PurchaseOrderID int NOT NULL
REFERENCES Purchasing.PurchaseOrderHeader(PurchaseOrderID),
LineNumber smallint NOT NULL,
ProductID int NULL
REFERENCES Production.Product(ProductID),
UnitPrice money NULL,
OrderQty smallint NULL,
ReceivedQty float NULL,
RejectedQty float NULL,
DueDate datetime NULL,
rowguid uniqueidentifier ROWGUIDCOL NOT NULL
CONSTRAINT DF_PurchaseOrderDetail_rowguid DEFAULT (newid()),
ModifiedDate datetime NOT NULL
CONSTRAINT DF_PurchaseOrderDetail_ModifiedDate DEFAULT (getdate()),
LineTotal AS ((UnitPrice*OrderQty)),
StockedQty AS ((ReceivedQty-RejectedQty)),
CONSTRAINT PK_PurchaseOrderDetail_PurchaseOrderID_LineNumber
PRIMARY KEY CLUSTERED (PurchaseOrderID, LineNumber)
WITH (IGNORE_DUP_KEY = OFF)
)
ON PRIMARY;
G.建立內含分類到 XML 結構描述集合之 XML 資料行的資料表
下列範例會建立一份含有 xml 資料行的資料表,且該資料行的類型符合 XML 結構描述集合 HRResumeSchemaCollection。 DOCUMENT 關鍵字指定 column_name 中 xml 資料類型的每個執行個體,都只能包含一個最上層元素。
CREATE TABLE HumanResources.EmployeeResumes
(LName nvarchar(25), FName nvarchar(25),
Resume xml( DOCUMENT HumanResources.HRResumeSchemaCollection) );
H.建立分割區資料表
下列範例會建立一個資料分割函數,將資料表或索引分割成四個資料分割。 之後,此範例會建立一個分割區配置來指定分別用來保留這四份分割區的檔案群組。 最後,這個範例會建立一份使用分割區配置的資料表。 這個範例假設這些檔案群組已在資料庫中。
CREATE PARTITION FUNCTION myRangePF1 (int)
AS RANGE LEFT FOR VALUES (1, 100, 1000) ;
GO
CREATE PARTITION SCHEME myRangePS1
AS PARTITION myRangePF1
TO (test1fg, test2fg, test3fg, test4fg) ;
GO
CREATE TABLE PartitionTable (col1 int, col2 char(10))
ON myRangePS1 (col1) ;
GO
分割區會以 PartitionTable 的 col1 資料行值為基礎而以下列方式進行指派。
檔案群組 |
test1fg |
test2fg |
test3fg |
test4fg |
---|---|---|---|---|
資料分割 |
1 |
2 |
3 |
4 |
值 |
col 1 <= 1 |
col1 > 1 AND col1 <= 100 |
col1 > 100 AND col1 <= 1,000 |
col1 > 1000 |
I.在資料行中使用 uniqueidentifier 資料類型
下列範例會建立一份含有 uniqueidentifier 資料行的資料表。 這個範例會利用 PRIMARY KEY 條件約束來保護資料表,以免使用者插入重複的值,以及利用 DEFAULT 條件約束中的 NEWSEQUENTIALID() 函數來提供新資料列的值。 ROWGUIDCOL 屬性會套用到 uniqueidentifier 資料行,以便可以使用 $ROWGUID 關鍵字來參考它。
CREATE TABLE dbo.Globally_Unique_Data
(guid uniqueidentifier CONSTRAINT Guid_Default DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
Employee_Name varchar(60)
CONSTRAINT Guid_PK PRIMARY KEY (guid) );
J.使用計算資料行的運算式
下列範例會顯示如何利用 ((low + high)/2) 運算式來計算 myavg 計算資料行。
CREATE TABLE dbo.mytable
( low int, high int, myavg AS (low + high)/2 ) ;
K.建立以使用者定義類型資料行為基礎的計算資料行
下列範例會建立一份資料表,含有定義為使用者定義型別 utf8string 的資料行,且假設目前資料庫中已建立了這個類型的組件及這個類型本身。 第二個資料行則是以 utf8string 為基礎來定義,且利用 type(class) utf8string 的 ToString() 方法來計算資料行的值。
CREATE TABLE UDTypeTable
( u utf8string, ustr AS u.ToString() PERSISTED ) ;
L.使用計算資料行的 USER_NAME 函數
下列範例會使用 myuser_name 資料行中的 USER_NAME() 函數。
CREATE TABLE dbo.mylogintable
( date_in datetime, user_id int, myuser_name AS USER_NAME() ) ;
M.建立具有 FILESTREAM 資料行的資料表
下列範例會建立一份含有 FILESTREAM 資料行 Photo 的資料表。 如果資料表具有一個或多個 FILESTREAM 資料行,此資料表就必須具有一個 ROWGUIDCOL 資料行。
CREATE TABLE dbo.EmployeePhoto
(
EmployeeId int NOT NULL PRIMARY KEY,
,Photo varbinary(max) FILESTREAM NULL
,MyRowGuidColumn uniqueidentifier NOT NULL ROWGUIDCOL
UNIQUE DEFAULT NEWID()
);
N.建立使用資料列壓縮的資料表
下列範例會建立一份使用資料列壓縮的資料表。
CREATE TABLE dbo.T1
(c1 int, c2 nvarchar(200) )
WITH (DATA_COMPRESSION = ROW);
如需其他資料壓縮範例,請參閱<資料壓縮>。
O.建立具有疏鬆資料行與資料行集的資料表
下列範例會示範如何建立一份含有疏鬆資料行的資料表,以及一份含有兩個疏鬆資料行與資料行集的資料表。 此範例會使用基本語法。 如需更複雜的範例,請參閱<使用疏鬆資料行>和<使用資料行集>。
此範例會建立一份含有疏鬆資料行的資料表。
CREATE TABLE dbo.T1
(c1 int PRIMARY KEY,
c2 varchar(50) SPARSE NULL ) ;
此範例會建立一份含有兩個疏鬆資料行與一個名為 CSet 之資料行集的資料表。
CREATE TABLE T1
(c1 int PRIMARY KEY,
c2 varchar(50) SPARSE NULL,
c3 int SPARSE NULL,
CSet XML COLUMN_SET FOR ALL_SPARSE_COLUMNS ) ;
請參閱
參考
sys.dm_sql_referenced_entities (Transact-SQL)
sys.dm_sql_referencing_entities (Transact-SQL)
CREATE PARTITION FUNCTION (Transact-SQL)
CREATE PARTITION SCHEME (Transact-SQL)