共用方式為


CREATE TABLE (Transact-SQL)

建立新的資料表。

主題連結圖示Transact-SQL 語法慣例

語法

CREATE TABLE 
    [ database_name . [ schema_name ] . | schema_name . ] table_name 
        ( { <column_definition> | <computed_column_definition> 
                | <column_set_definition> }
        [ <table_constraint> ] [ ,...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 ] ] 
<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 ) 
} 

<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 ] )
        ]
    | [ 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 ) 
    [ ON { partition_scheme_name ( partition_column_name ) 
        | filegroup | "default" } ]
] 

<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_option> ::=
{
    DATA_COMPRESSION = { NONE | ROW | PAGE }
      [ ON PARTITIONS ( { <partition_number_expression> | <range> } 
            [ , ...n ] ) ]
}

<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>

引數

  • database_name
    這是建立資料表的資料庫名稱。database_name 必須指定現有資料庫的名稱。如果未指定,database_name 便預設為目前的資料庫。目前連接的登入必須與 database_name 指定的資料庫中現有的使用者識別碼有關聯,且這個使用者識別碼必須具有 CREATE TABLE 權限。

  • schema_name
    這是新的資料表所屬的結構描述名稱。

  • table_name
    這是新資料表的名稱。資料表名稱必須遵照識別碼的規則。table_name 最多可用 128 個字元,但本機暫存資料表名稱 (名稱前附加一個數字符號 (#)) 除外,它不能超出 116 個字元。

  • column_name
    這是資料表中的資料行名稱。資料行名稱必須遵照識別碼的規則,且在資料表內必須是唯一的。column_name 最多可以有 128 個字元。利用 timestamp 資料類型來建立的資料行,可以省略 column_name 。如果未指定 column_name,timestamp 資料行的名稱便預設為 timestamp。

  • computed_column_expression
    這是定義計算資料行值的運算式。計算資料行是一個虛擬資料行,除非資料行標示了 PERSISTED,否則,並未實際儲存在資料表中。這個資料行是從使用相同資料表之其他資料行的運算式得出的。例如,計算資料行可能會有定義如下:cost AS price * qty。這個運算式可以是非計算的資料行名稱、常數、函數、變數,以及一個或多個運算子所連接的這些項目的任何組合。這個運算式不能是子查詢,也不能包含別名資料類型。

    計算資料行可用在選取清單、WHERE 子句、ORDER BY 子句中,或任何能夠使用正規運算式的其他位置中,但下列狀況例外:

    • 計算資料行不能用來做為 DEFAULT 或 FOREIGN KEY 條件約束定義,也不能搭配 NOT NULL 條件約束定義來使用。不過,如果計算資料行值是由具決定性的運算式所定義的,且索引資料行接受結果的資料類型,計算資料行便可用來做為索引中的索引鍵資料行,也可用在任何 PRIMARY KEY 或 UNIQUE 條件約束中。

      例如,如果資料表有整數資料行 ab,您可以建立計算資料行 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 {<partition_scheme> | filegroup | "default"} 也可以指定在 PRIMARY KEY 或 UNIQUE 條件約束中。這些條件約束會建立索引。如果指定了 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 DATABASEALTER DATABASE 陳述式來定義這個檔案。否則,就會引發錯誤。

    如需相關的 FILESTREAM 主題,請參閱<設計和實作 FILESTREAM 儲存體>。

  • [ 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 或系統函數。

  • IDENTITY
    指出新資料行是識別欄位。當新資料列加入資料表時,Database Engine 會提供資料行的唯一累加值。識別欄位通常用來搭配 PRIMARY KEY 條件約束一起使用,做為資料表的唯一資料列識別碼。IDENTITY 屬性可以指派給 tinyint、smallint、int、bigint、decimal(p,0) 或 numeric(p,0) 等資料行。每份資料表都只能建立一個識別欄位。繫結的預設值和 DEFAULT 條件約束無法搭配識別欄位使用。您必須同時指定種子和遞增,或同時不指定這兩者。如果同時不指定這兩者,預設值便是 (1,1)。

  • seed
    這是載入資料表的第一個資料列所用的值。

  • increment
    這是加入先前載入的資料列之識別值的累加值。

  • NOT FOR REPLICATION
    在 CREATE TABLE 陳述式中,IDENTITY 屬性、FOREIGN KEY 條件約束和 CHECK 條件約束,都可以指定 NOT FOR REPLICATION 子句。如果 IDENTITY 屬性指定了這個子句,當複寫代理程式執行插入時,值不會在識別欄位中累加。如果條件約束指定了這個子句,當複寫代理程式執行插入、更新或刪除作業時,不會強制執行這個條件約束。如需詳細資訊,請參閱<使用 NOT FOR REPLICATION 控制條件約束、識別和觸發程序>。

  • ROWGUIDCOL
    指出新資料行是一個資料列 GUID 資料行。每份資料表都只能有一個 uniqueidentifier 資料行指定為 ROWGUIDCOL 資料行。套用 ROWGUIDCOL 屬性後便可以利用 $ROWGUID 來參考資料行。ROWGUIDCOL 屬性只能指派給 uniqueidentifier 資料行。如果資料庫相容性層級是 65 或以下,ROWGUIDCOL 關鍵字便無效。如需詳細資訊,請參閱<sp_dbcmptlevel (Transact-SQL)>。使用者自訂資料類型資料行不能用 ROWGUIDCOL 來指定。

    ROWGUIDCOL 屬性不會強制執行資料行中所儲存之值的唯一性。它也不會自動為插入資料表中的新資料列產生值。若要產生每個資料行的唯一值,請在 INSERT 陳述式上使用 NEWIDNEWSEQUENTIALID 函數,或利用這些函數當做資料行的預設值。

  • 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。

  • 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。

    例如,在 AdventureWorks 資料庫中,ProductVendor 資料表與 Vendor 資料表有參考關聯性。ProductVendor.VendorID 外部索引鍵會參考 Vendor.VendorID 主索引鍵。

    如果在 Vendor 資料表的某資料列上執行 DELETE 陳述式,且指定了 ProductVendor.VendorID 的 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。

    例如,在 AdventureWorks 資料庫中,ProductVendor 資料表與 Vendor 資料表有參考關聯性:ProductVendor.VendorID 外部索引鍵會參考 Vendor.VendorID 主索引鍵。

    如果在 Vendor 資料表的某資料列上執行 UPDATE 陳述式,且指定了 ProductVendor.VendorID 的 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_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
    這是資料行集的名稱。資料行集是不具類型的 XML 表示,可將資料表的所有疏鬆資料行結合到結構化輸出中。如需有關資料行集的詳細資訊,請參閱<使用資料行集>。

  • < table_option> ::=
    指定一個或多個資料表選項。

  • 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 INDEXALTER INDEXUPDATE 時,這個選項沒有任何作用。預設值是 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。

備註

SQL Server 2008 的每個資料庫最多可以有 20 億份資料表。包含已定義之資料行集的資料表最多可以有 30,000 個資料行,而且非疏鬆 + 計算資料行的上限為 1024。沒有資料行集的資料表限制為 1024 個資料行。資料列數和資料表的總大小只受限於可用的儲存體。每一個資料列最大位元組數為 8,060。對於含有 varchar、nvarchar、varbinary 或 sql_variant 資料行的資料表,這項限制比較寬鬆,這些資料行會使資料表的定義總寬度超出 8,060 個位元組。每個這些資料行的長度仍必須在 8,000 位元組的限制內,不過,它們在資料表中的組合寬度可以超出 8,060 位元組的限制。如需詳細資訊,請參閱<超過 8 KB 的資料列溢位資料>。

每份資料表最多可以包含 999 個非叢集索引和 1 個叢集索引。其中包括為了支援任何定義給資料表的 PRIMARY KEY 和 UNIQUE 條件約束而產生的索引。

空間通常會以每次一個範圍的遞增來配置給資料表和索引。當建立資料表或索引時,會從混合範圍配置資料表或索引的頁面,直到它的頁面足以填滿一個統一範圍為止。在它有足以填滿統一範圍的頁面之後,每當目前配置的範圍已滿之後,便會配置另一個範圍。如需資料表所配置和使用之空間量的報表,請執行 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 條件約束不能參考暫存資料表。

我們建議您利用資料表變數來取代暫存資料表。當必須在暫存資料表上建立索引時,或當必須跨越多個預存程序或函數來見到資料表值時,暫存資料表非常有用。一般而言,資料表變數會使查詢的處理更有效。如需詳細資訊,請參閱<資料表 (Transact-SQL)>。

資料分割資料表

在利用 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 使用者定義型別>。

  • 只有在所參考的主索引鍵也定義成 varchar(max) 類型時,varchar(max) 類型的資料行才能夠參與 FOREIGN KEY 條件約束。

DEFAULT 定義

  • 資料行只能有一個 DEFAULT 定義。

  • DEFAULT 定義可以包含常數值、函數、SQL-92 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 來卸除條件約束。建立給條件約束、供條件約束使用的索引可以利用 DBCC DBREINDEX 來重建。

  • 條件約束名稱必須遵照識別碼的規則,不過,名稱開頭不能是數字符號 (#)。如果未提供 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 會選擇適當的鎖定,且可以將鎖定從資料列或頁面鎖定擴大到資料表鎖定。如需詳細資訊,請參閱<鎖定擴大 (Database Engine)>。如果 ALLOW_ROW_LOCKS = OFF 且 ALLOW_PAGE_LOCK = OFF,當您存取索引時,只允許資料表層級的鎖定。如需有關設定索引之鎖定資料粒度的詳細資訊,請參閱<自訂索引的鎖定>。

  • 如果資料表有 FOREIGN KEY 或 CHECK CONSTRAINTS 和觸發程序,就會先評估條件約束的條件,再執行觸發程序。

針對資料表及其資料行的報表,請使用 sp_helpsp_helpconstraint。若要重新命名資料表,請使用 sp_rename。如需相依於資料表之檢視表和預存程序的報表,請使用 sys.dm_sql_referenced_entitiessys.dm_sql_referencing_entities

資料表定義內的 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 使用者定義型別

Null 屬性取決於資料行定義。

系統提供的資料類型

如果系統提供的資料類型只有一個選項,則優先使用它。timestamp 資料類型必須是 NOT NULL。

當利用 SET 將任何工作階段設定設為 ON 時:

  • ANSI_NULL_DFLT_ON = ON,指派 NULL。

  • ANSI_NULL_DFLT_OFF = ON,指派 NOT NULL。

  • 當利用 ALTER DATABASE 來設定任何資料庫設定:

  • ANSI_NULL_DEFAULT_ON = ON,指派 NULL。

  • ANSI_NULL_DEFAULT_OFF = ON,指派 NOT NULL。

  • 若要檢視 ANSI_NULL_DEFAULT 的資料庫設定,請使用 sys.databases 目錄檢視。

當工作階段並未設定任何一個 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 預存程序。

權限

需要資料庫中的 CREATE TABLE 權限及建立資料表的結構描述之 ALTER 權限。

如果將 CREATE TABLE 陳述式中的任何資料行定義成 CLR 使用者定義型別,就需要類型的擁有權或它的 REFERENCES 權限。

如果 CREATE TABLE 陳述式中的任何資料行有相關聯的 XML 結構描述集合,就需要 XML 結構描述集合的擁有權或它的 REFERENCES 權限。

範例

A. 使用 PRIMARY KEY 條件約束

下列範例會顯示含 AdventureWorks 範例資料庫 Employee 資料表 (允許系統提供條件約束名稱) 之 EmployeeID 資料行的叢集索引之 PRIMARY KEY 條件約束的資料行定義。

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)

多重資料行索引鍵條件約束會建立成資料表條件約束。在 AdventureWorks 資料庫中,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 陳述式)。例如,AdventureWorks 資料庫可以包括一份查閱資料表,列出公司中員工能夠填入的不同作業。在描述每項作業的資料行中,當並未明確輸入實際描述時,字元字串預設值可以提供一項描述。

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. 顯示完整的資料表定義

下列範例會顯示含有 AdventureWorks 資料庫中所建立的 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 資料行的資料表,且該資料行的類型符合 XML 結構描述集合 HRResumeSchemaCollection。DOCUMENT 關鍵字指定 column_name 中 xml 資料類型的每個執行個體,都只能包含一個最上層元素。

USE AdventureWorks;
GO
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 T1 
(c1 int, c2 nvarchar(200) )
WITH (DATA_COMPRESSION = ROW);

如需其他資料壓縮範例,請參閱<建立壓縮資料表及索引>。

O. 建立具有疏鬆資料行和資料行集的資料表

下列範例會示範如何建立一份含有疏鬆資料行的資料表,以及一份含有兩個疏鬆資料行與資料行集的資料表。此範例會使用基本語法。如需更複雜的範例,請參閱<使用疏鬆資料行>和<使用資料行集>。

若要建立一份含有疏鬆資料行的資料表,請執行下列程式碼。

CREATE TABLE 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 ) ;