ALTER TABLE column_definition (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Microsoft 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 个字符。 对于使用 时间戳 数据类型创建的新列, 可以省略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
仅适用于 varchar、nvarchar 和 varbinary 数据类型 。 这些 (max) 数据类型用于存储 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
适用于:SQL Server 2008 (10.0.x) 及更高版本。

仅适用于 xml 数据类型,用于将 XML 架构集合与该类型相关联。 在将 xml 数据类型列添加到架构之前,必须先使用 CREATE XML SCHEMA COLLECTION 在数据库中创建架构。

FILESTREAM

还可以为拥有数据类型为 varbinary(max) 的 type_name 的列指定 FILESTREAM 存储属性。

为列指定了 FILESTREAM 后,该表还必须有一个具有 ROWGUIDCOL 属性且数据类型为 uniqueidentifier 的列。 此列不得为空值且必须具有 UNIQUE 或 PRIMARY KEY 单列约束。 GUID插入数据或 DEFAULT 约束时,应用程序会提供列的值。

如果为表定义了 FILESTREAM 列,则不能删除 ROWGUIDCOL 列并且不能更改相关的约束。 仅当删除了最后一个 FILESTREAM 列后,才能删除 ROWGUIDCOL 列。

当为某个列指定了 FILESTREAM 存储属性时,该列的所有值都将存储在文件系统上的 FILESTREAM 数据容器中。

有关演示如何使用列定义的示例,请参阅 FILESTREAM

COLLATE collation_name

指定列的排序规则。 如果未指定,则为该列分配数据库的默认排序规则。 排序规则名称既可以是 Windows 排序规则名称,也可以是 SQL 排序规则名称。 有关列表和详细信息,请参阅 Windows 排序规则名称SQL Server 排序规则名称

COLLATE句可用于仅指定 charvarchar、ncharnvarchar 数据类型的列的排序规则。

有关子 COLLATE 句的详细信息,请参阅 COLLATE

NULL |NOT NULL

确定列中是否 NULL 允许值。 NULL 不是严格限制,但可以像指定一样 NOT NULL

[ CONSTRAINT constraint_name ]

指定值定义的开始 DEFAULT 。 为了保持与早期版本的 SQL Server 的兼容性,可以将约束名称分配给一个 DEFAULT constraint_name必须遵循标识符的规则,但名称不能以数字符号 (#) 开头。 如果未指定 constraint_name ,则会向 DEFAULT 定义分配系统生成的名称。

DEFAULT

指定列的默认值的关键字。 DEFAULT 定义可用于为现有数据行中的新列提供值。 DEFAULT 定义不能应用于 时间戳 列或具有属性的 IDENTITY 列。 如果为用户定义类型列指定了默认值,则该类型必须支持从 constant_expression 到用户定义类型的隐式转换。

constant_expression
是用作默认列值的文字值、或 NULL系统函数。 如果与定义为 .NET Framework 用户定义类型的列一起使用,该类型的实现必须支持从 constant_expression 到用户定义的类型的隐式转换。

WITH VALUES

添加列和 DEFAULT 约束时,如果列允许 NULLS, WITH VALUES 则将新列的值设置为现有行中 DEFAULT constant_expression 给定的值。

如果所添加的列不允许对现有行使用 NULLS,则列的值将始终设置为给定 DEFAULT constant expression的值。

从 SQL Server 2012(11.x)开始,这可以是添加 非 null 列的元数据作,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

种子 用于加载到表中的第一行的值。

增加 添加到加载的上一行的标识值的增量值。

NOT FOR REPLICATION

适用于:SQL Server 2008 (10.0.x) 及更高版本。

可以为属性指定 IDENTITY 。 如果为 IDENTITY 属性指定了此子句,则复制代理执行插入作时,标识列中的值不会递增。

ROWGUIDCOL

适用于:SQL Server 2008 (10.0.x) 及更高版本。

指定该列是一个行全局唯一标识符列。 ROWGUIDCOL 只能分配给 uniqueidentifier 列,每个表只能指定一个 uniqueidentifier 列作为 ROWGUIDCOL 列。 ROWGUIDCOL 不能分配给用户定义的数据类型的列。

ROWGUIDCOL 不强制实施列中存储的值的唯一性。 此外, ROWGUIDCOL 不会为插入到表中的新行自动生成值。 若要为每个列生成唯一值,请使用对INSERT语句的NEWID()函数,或将NEWID()函数指定为列的默认值。 有关详细信息,请参阅 NEWID(Transact-SQL)INSERT(Transact-SQL)。

SPARSE

指示列为稀疏列。 稀疏列已针对 NULL 值进行了存储优化。 不能将稀疏列指定为 NOT NULL。 有关稀疏列的其他限制和详细信息,请参阅使用稀疏列

<column_constraint>
有关列约束参数的定义,请参阅 column_constraint (Transact-SQL)

ENCRYPTED WITH

使用 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 实例支持具有安全 enclave 的 Always Encrypted

如果使用的是 Always Encrypted(不带安全 enclave),请对要使用参数或分组参数搜索的列使用确定性加密,例如政府 ID 号。 对未与其他记录分组或用于联接表的数据(如信用卡号)使用随机加密,而不搜索,因为使用其他列(如事务编号)查找包含相关加密列的行。

如果使用的是具有安全 enclave 的 Always Encrypted,则随机加密是推荐的加密类型。

列必须是符合条件的数据类型。

ALGORITHM

适用于:SQL Server 2016 (13.x) 及更高版本、SQL 数据库。

须是“AEAD_AES_256_CBC_HMAC_SHA_256”。

有关包括功能约束在内的详细信息,请参阅 Always Encrypted(数据库引擎)

添加 MASKED WITH (FUNCTION = ' mask_function ')

适用于:SQL Server 2016 (13.x) 及更高版本、SQL 数据库。

指定动态数据掩码。 mask_function 是具有相应参数的掩码函数的名称。 可用函数包括:

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

有关函数参数的信息,请参阅动态数据掩码

Remarks

如果添加了具有 uniqueidentifier 数据类型的列,则可以使用该 NEWID() 函数为表中每个现有行提供新列中的唯一标识符值的默认定义。 有关详细信息,请参阅 NEWID(Transact-SQL)。

数据库引擎不强制在列定义中指定DEFAULTIDENTITYROWGUIDCOL或列约束。

如果添加列会导致数据行大小超过 8,060 字节,则 ALTER TABLE 语句将失败。

Examples

有关示例,请参阅 ALTER TABLE (Transact-SQL)