共用方式為


ALTER TABLE column_definition (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric 中的倉庫Microsoft Fabric 中的 SQL 資料庫

使用 ALTER TABLE 指定新增至資料表之資料行的屬性。

Transact-SQL 語法慣例

Syntax

column_name <data_type>  
[ FILESTREAM ]  
[ COLLATE collation_name ]   
[ NULL | NOT NULL ]  
[   
    [ CONSTRAINT constraint_name ] DEFAULT constant_expression [ WITH VALUES ]   
    | IDENTITY [ ( seed , increment ) ] [ NOT FOR REPLICATION ]   
]  
[ ROWGUIDCOL ]   
[ SPARSE ]   
[ ENCRYPTED WITH  
  ( COLUMN_ENCRYPTION_KEY = key_name ,  
      ENCRYPTION_TYPE = { DETERMINISTIC | RANDOMIZED } ,   
      ALGORITHM =  'AEAD_AES_256_CBC_HMAC_SHA_256'   
  ) ]  
[ MASKED WITH ( FUNCTION = ' mask_function ') ]  
[ <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 )   
}  

Arguments

column_name

要改變、新增或卸除的資料欄名稱。 column_name 可由 1 到 128 個字元組成。 針對以 timestamp 數據類型建立的新數據行, 可以省略column_name 。 如果沒有為 timestamp 資料類型資料行指定任何 column_name,則會使用 timestamp 這個名稱。

[type_schema_name。 ] type_name

加入之數據行的數據類型,以及其所屬的架構。

type_name 可以是:

  • Microsoft SQL Server 系統資料類型。

  • 基於 SQL Server 系統資料類型的別名資料類型。 別名數據類型必須先使用 來 CREATE TYPE 建立,才能在數據表定義中使用。

  • Microsoft .NET Framework 使用者定義型別及其所屬的結構描述。 必須先使用 CREATE TYPE 建立 .NET Framework 使用者定義類型,才能在數據表定義中使用。

若未指定 type_schema_name,則 Microsoft 資料庫引擎會以下列順序來參考 type_name

  • SQL Server 系統資料類型。

  • 目前資料庫中之目前使用者的預設結構描述。

  • 目前資料庫中的 dbo 結構描述。

precision
所指定資料類型的有效位數。 如需有關有效位數值的詳細資訊,請參閱有效位數、小數位數和長度

scale
所指定資料類型的小數位數。 如需有關有效小數位數值的詳細資訊,請參閱有效位數、小數位數和長度

max
僅適用於 varcharnvarchar,和 varbinary 資料類型。 這些 (max) 數據類型用於儲存 2^31 個字節的字元和二進位數據,以及 2^30 個字節的 Unicode 數據。

CONTENT
指定 column_namexml 資料類型的每個執行個體都可以由多個最上層項目組成。 CONTENT 僅適用於 xml 數據類型,而且只有在同時指定 xml_schema_collection 時,才能指定。 如果未指定 CONTENT ,則為預設行為。

DOCUMENT
指定 column_namexml 資料類型的每個執行個體都只能由一個最上層項目組成。 DOCUMENT 僅適用於 xml 數據類型,而且只有在同時指定 xml_schema_collection 時,才能指定。

xml_schema_collection
適用於:SQL Server 2008 (10.0.x) 和更新版本。

只適用於 xml 資料類型,以便將 XML 結構描述集合與類型產生關聯。 將 xml 資料類型數據行加入架構之前,必須先使用 CREATE XML SCHEMA COLLECTION 在資料庫中建立架構。

FILESTREAM

選擇性的針對具有 varbinary(max)type_name 的資料行指定 FILESTREAM 儲存屬性。

當針對資料行指定 FILESTREAM 時,資料表也必須要有 uniqueidentifier 資料類型的資料行 (此類型具有 ROWGUIDCOL 屬性)。 這個資料行不能允許 null 值,且必須具有 UNIQUE 或 PRIMARY KEY 單一資料行條件約束。 插入 GUID 資料或 DEFAULT 條件約束時,應用程式會提供資料行的值。

ROWGUIDCOL 資料行無法卸除,而且當資料表有定義 FILESTREAM 資料行時,無法變更相關的條件約束。 只有當最後一個 FILESTREAM 資料行卸除之後,才可卸除 ROWGUIDCOL 資料行。

當有針對資料行指定 FILESTREAM 儲存屬性時,該資料行的所有值都會儲存在檔案系統的 FILESTREAM 資料容器內。

如需示範如何使用數據行定義的範例,請參閱 FILESTREAM

分套 collation_name

指定資料行的定序。 若未指定,就會將資料庫的預設定序指派給資料行。 定序名稱可以是 Windows 定序名稱或 SQL 定序名稱。 如需清單和詳細資訊,請參閱 Windows 定序名稱SQL Server 定序名稱

COLLATE子句只能用來指定 charvarchar、ncharnvarchar 數據類型之數據行的定序。

如需 子句的詳細資訊 COLLATE ,請參閱 COLLATE

NULL |NOT NULL

判斷數據行中是否 NULL 允許值。 NULL 不是嚴格的條件約束,但可以像 一樣 NOT NULL指定。

[ 限制 constraint_name ]

指定值定義的開頭 DEFAULT 。 若要維持與舊版 SQL Server 的相容性,可以將條件約束名稱指派給 DEFAULT constraint_name必須遵循標識符的規則,不同之處在於名稱不能以數位符號 (#) 開頭。 如果未指定 constraint_name ,系統產生的名稱會指派給 DEFAULT 定義。

DEFAULT

這是指定資料行預設值的關鍵字。 DEFAULT 定義可用來提供現有數據列中新數據行的值。 DEFAULT 定義無法套用至 時間戳 數據行,或具有 屬性的數據行 IDENTITY 。 如果使用者定義型別資料行指定了預設值,類型必須支援將 constant_expression 隱含轉換成使用者定義型別。

constant_expression
這是常值、、 NULL或系統函式,用來做為預設數據行值。 如果搭配定義為 .NET Framework 使用者定義型別的數據行使用,則型別的實作必須支援從 constant_expression 隱含轉換成使用者定義型別。

以價值為基礎

加入資料行和 DEFAULT 條件約束時,如果數據行允許NULLS, WITH VALUES 請將新數據行的值設定為現有數據列中指定的 DEFAULT constant_expression 值。

如果加入的數據行不允許NULLS,針對現有的數據列,數據行的值一律會設定為 中指定的 DEFAULT constant expression值。

從 SQL Server 2012 (11.x) 開始,這可以是元數據作業 ,新增-not-null-columns-as-an-online-operation

如果在相關資料行沒有一起新增的情況下使用此方法,則它沒有作用。

指定 中指定的 DEFAULT constant_expression 值會儲存在新增至現有數據列的新數據行中。 如果加入的資料行允許 Null 值,且指定了 WITH VALUES,就會將預設值儲存在加入現有資料列的新資料行中。 如果未 WITH VALUES 針對允許 Null 的數據行指定,則 NULL 值會儲存在新的資料行中,並儲存在現有的數據列中。 如果新資料行不允許 NULL,就會將預設值儲存在新資料列中,不論是否指定了 WITH VALUES,都是如此。

IDENTITY

指定新資料行是識別欄位。 SQL Server 資料庫引擎會提供資料行的唯一累加值。 將識別碼資料行加入現有資料表時,識別碼便會加入至資料表中含有初始值和遞增值的現有資料列。 但是,無法保證資料列的更新順序。 任何加入的新資料列也都會產生識別碼。

識別數據行通常與條件約束搭配 PRIMARY KEY 使用,做為數據表的唯一數據列標識符。 屬性IDENTITY可以指派給 tinyint、smallintintbigintdecimal(p,0)或 numeric(p,0 數據行。 每份資料表都只能建立一個識別欄位。 DEFAULT關鍵詞和系結預設值無法與識別數據行搭配使用。 您必須同時指定種子和遞增,或同時不指定這兩者。 如果兩者都未指定,則預設值為 (1,1)

Note

您無法修改現有的資料表資料列來新增 IDENTITY 屬性。

不支援將識別欄位加入已發行的資料表中,因為當資料行複寫到訂閱者時,它可能造成非聚合。 簽發者端識別欄位中的值,隨著受影響的資料表之資料列的實際儲存順序而不同。 數據列可能會以不同的方式儲存在訂閱者端;因此,相同數據列的標識列值可能會不同。

若要藉由允許明確插入值來停用 IDENTITY 數據行的 屬性,請使用 SET IDENTITY_INSERT

種子 用於載入資料表之第一個數據列的值。

增加 新增至已載入上一個數據列之識別值的累加值。

不適用於複寫

適用於:SQL Server 2008 (10.0.x) 和更新版本。

可以為屬性指定 IDENTITY 。 如果為 IDENTITY 屬性指定這個子句,當復寫代理程式執行插入作業時,識別數據行不會遞增值。

ROWGUIDCOL

適用於:SQL Server 2008 (10.0.x) 和更新版本。

指定資料行是一個資料列全域唯一識別碼資料行。 ROWGUIDCOL 只能指派給 uniqueidentifier 資料行,而且每個數據表只能指定一個 uniqueidentifier 數據行做為 ROWGUIDCOL 數據行。 ROWGUIDCOL 無法指派給使用者定義數據類型的數據行。

ROWGUIDCOL 不會強制執行儲存在數據行中之值的唯一性。 此外, ROWGUIDCOL 不會針對插入數據表的新數據列自動產生值。 若要為每個數據行產生唯一值,請使用 NEWID() 語句上的 INSERT 函式,或指定函 NEWID() 式做為數據行的預設值。 如需詳細資訊,請參閱 NEWID (Transact-SQL)INSERT (Transact-SQL)。

SPARSE

指出此資料行是疏鬆資料行。 疏鬆資料行的儲存體會針對 Null 值最佳化。 疏鬆資料行無法指定為 NOT NULL。 如需有關疏鬆資料行的其他限制和詳細資訊,請參閱使用疏鬆資料行

<column_constraint>
如需有關資料行條件約束引數的定義,請參閱 column_constraint (Transact-SQL)

加密為

指定使用 Always Encrypted 功能來加密資料行。 ENCRYPTED WITH 在 Microsoft Fabric 的 SQL 資料庫中不支援。

COLUMN_ENCRYPTION_KEY = key_name

指定資料行加密金鑰。 如需詳細資訊,請參閱 CREATE COLUMN ENCRYPTION KEY (Transact-SQL)

ENCRYPTION_TYPE = { DETERMINISTIC |RANDOMIZED }

確定性加密 使用的方法一律會針對任何指定純文字值產生相同加密值。 使用確定性加密時,可允許使用相等比較來進行搜尋、使用以加密值為基礎的相等聯結來群組和聯結表格,但也可讓未經授權的使用者檢查加密資料行中的模式,以此猜測加密值的相關資訊。 只有這兩個資料行都是使用相同的資料行加密金鑰時,才有可能將確定性加密資料行上的兩個資料表聯結起來。 確定性加密必須針對字元資料行使用 binary2 排序次序的資料行定序。

隨機加密 使用的方法會以更難預測的方式來加密資料。 隨機化加密更為安全,但會防止任何對加密資料行的計算和編製索引,除非您的 SQL Server 執行個體支援具有安全記憶體保護區的 Always Encrypted

如果您使用 Always Encrypted (無安全記憶體保護區),則請使用要使用參數或分組參數所搜尋的決定性加密 (例如政府識別碼)。 針對未與其他記錄分組或用來聯結數據表的信用卡號碼等數據,使用隨機加密,但不會搜尋,因為您使用其他數據行(例如交易編號)來尋找包含感興趣加密數據行的數據列。

如果您使用具有安全記憶體保護區的 Always Encrypted,則隨機化加密是建議的加密類型。

資料行必須為合格的資料類型。

ALGORITHM

適用於:SQL Server 2016 (13.x) 和更新版本,以及 SQL Database。

必須為 'AEAD_AES_256_CBC_HMAC_SHA_256'

如需包括功能條件約束的詳細資訊,請參閱永遠加密 (資料庫引擎)

ADD MASKED WITH (FUNCTION = ' mask_function ')

適用於:SQL Server 2016 (13.x) 和更新版本,以及 SQL Database。

指定動態資料遮罩。 mask_function 是遮罩函式的名稱並具備適當的參數。 下列是可以使用的函式:

  • default()
  • email()
  • partial()
  • random()

如需函式參數,請參閱動態資料遮罩

Remarks

如果加入數據行具有 uniqueidentifier 數據類型,則可以使用使用 函式的預設值 NEWID() 來定義,為數據表中每個現有數據列提供新數據行中的唯一標識符值。 如需詳細資訊,請參閱 NEWID (Transact-SQL)

Database Engine 不會強制執行在數據行定義中指定 DEFAULTIDENTITYROWGUIDCOL或 數據行條件約束的順序。

如果加入數據行會導致數據列大小超過8,060個字節,語句 ALTER TABLE 就會失敗。

Examples

如需範例,請參閱 ALTER TABLE (Transact-SQL)