指定使用 ALTER TABLE 添加到表中的列的属性。
语法
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 ]
[ <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 )
}
参数
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 用户定义类型及其所属架构。 .NET Framework 用户定义类型必须先使用 CREATE TYPE 进行创建,然后才能在表定义中使用。
如果未指定 type_schema_name,则 Microsoft 数据库引擎将按以下顺序引用 type_name:
SQL Server 系统数据类型。
当前数据库中当前用户的默认架构。
当前数据库中的 dbo 架构。
precision
指定的数据类型的精度。 有关有效精度值的详细信息,请参阅精度、小数位数和长度 (Transact-SQL)。scale
是指定数据类型的小数位数。 有关有效小数位数值的详细信息,请参阅精度、小数位数和长度 (Transact-SQL)。max
只应用于 varchar、nvarchar 和 varbinary 数据类型。 它们用于存储 2^31 个字节的字符和二进制数据,以及 2^30 个字节的 Unicode 数据。CONTENT
指定 column_name 中每个数据类型为 xml 的实例都可以包含多个顶级元素。 CONTENT 仅适用于 xml 数据类型,并且只有在同时指定了 xml_schema_collection 时才能指定 CONTENT。 如果未指定,则默认行为是 CONTENT。DOCUMENT
指定 column_name 中每个数据类型为 xml 的实例都只能包含一个顶级元素。 DOCUMENT 仅适用于 xml 数据类型,并且只有同时指定了 xml_schema_collection 时才能指定 DOCUMENT。xml_schema_collection
仅适用于 xml 数据类型,用于将 XML 架构集合与该类型相关联。 在架构中键入 xml 列之前,必须先使用 CREATE XML SCHEMA COLLECTION 在数据库中创建该架构。FILESTREAM
还可以为拥有数据类型为 varbinary(max) 的 type_name 的列指定 FILESTREAM 存储属性。为列指定了 FILESTREAM 后,该表还必须有一个具有 ROWGUIDCOL 属性且数据类型为 uniqueidentifier 的列。 此列不得为空值且必须具有 UNIQUE 或 PRIMARY KEY 单列约束。 该列的 GUID 值必须在插入数据时由应用程序提供,或由使用 NEWID () 函数的 DEFAULT 约束提供。
如果为表定义了 FILESTREAM 列,则不能删除 ROWGUIDCOL 列并且不能更改相关的约束。 仅当删除了最后一个 FILESTREAM 列后,才能删除 ROWGUIDCOL 列。
当为某个列指定了 FILESTREAM 存储属性时,该列的所有值都将存储在文件系统上的 FILESTREAM 数据容器中。
有关如何使用列定义的示例,请参阅 FILESTREAM (SQL Server)。
COLLATE collation_name
指定列的排序规则。 如果未指定,则为该列分配数据库的默认排序规则。 排序规则名称既可以是 Windows 排序规则名称,也可以是 SQL 排序规则名称。 有关列表及详细信息,请参阅 Windows 排序规则名称 (Transact-SQL)和 SQL Server 排序规则名称 (Transact-SQL)。COLLATE 子句只能用于指定 char、varchar、nchar 和 nvarchar 数据类型的列的排序规则。
有关 COLLATE 子句的详细信息,请参阅 COLLATE (Transact-SQL)。
NULL | NOT NULL
确定列中是否允许空值。 严格来讲,NULL 不是约束,但可以像指定 NOT NULL 那样指定它。[ CONSTRAINT constraint_name ]
指定 DEFAULT 值定义的开头。 为了与 SQL Server 的早期版本兼容,可以为 DEFAULT 分配约束名称。 除了不能以数字符号 (#) 开头以外,constraint_name 还必须符合 标识符的规则。 如果未指定 constraint_name,则 DEFAULT 定义使用系统生成的名称。DEFAULT
指定列的默认值的关键字。 DEFAULT 定义可用于为现有数据行中的新列提供值。 DEFAULT 定义不能应用于 timestamp 列,也不能应用于具有 IDENTITY 属性的列。 如果为用户定义类型列指定了默认值,则该类型必须支持从 constant_expression 到用户定义类型的隐式转换。constant_expression
用作默认列值的文字值、NULL 或者系统函数。 如果与定义为 .NET Framework 用户定义类型的列结合使用,则该类型的实现必须支持从 constant_expression 到用户定义类型的隐式转换。WITH VALUES
指定 DEFAULT constant_expression 中给定的值将存储在添加到现有行的新列中。 如果添加的列允许空值并指定了 WITH VALUES,则在添加到现有行的新列中存储默认值。 如果没有为允许空值的列指定 WITH VALUES,则在现有行的新列中存储 NULL 值。 如果新列不允许空值,则不论是否指定 WITH VALUES,都将在新行中存储默认值。IDENTITY
指定新列为标识列。 SQL Server 数据库引擎为该列提供唯一的增量值。 当您向现有表中添加标识符列时,还会将标识号添加到具有种子值和增量值的现有表行中。无法保证行的更新顺序。 也会为添加的任何新行生成标识号。标识列通常与 PRIMARY KEY 约束一起用作表的唯一行标识符。 tinyint、smallint、int、bigint、decimal(p,0) 或 numeric(p,0) 列可以使用 IDENTITY 属性。 每个表只能创建一个标识列。 DEFAULT 关键字和绑定默认值不能用于标识列。 要么同时指定种子和增量,要么都不指定。 如果二者都未指定,则取默认值 (1,1)。
注意
不能修改现有的表列以添加 IDENTITY 属性。
不支持向已发布的表添加标识列,因为将列复制到订阅服务器时,这会导致无法收敛。 发布服务器的标识列中的值取决于受影响的表中行的物理存储顺序。 行在订阅服务器中的存储顺序可能会有所不同;因此对于相同的行,标识列的值可能会不同。
若要通过允许显式插入值来禁用某列的 IDENTITY 属性,请使用 SET IDENTITY_INSERT。
seed
用于表中所加载的第一行的值。increment
增加到上一个加载行的标识值的增量值。NOT FOR REPLICATION
可以为 IDENTITY 属性指定该子句。 如果为 IDENTITY 属性指定了该子句,则当复制代理执行插入操作时,标识列中的值不会增加。ROWGUIDCOL
指定该列是一个行全局唯一标识符列。 ROWGUIDCOL 只能分配给 uniqueidentifier 列,并且每个表中只有一个 uniqueidentifier 列可以被指定为 ROWGUIDCOL 列。 不能为用户定义数据类型分配 ROWGUIDCOL。ROWGUIDCOL 并不强制列中所存储值的唯一性。 另外,该属性也不会为插入到表中的新行自动生成值。 若要为每列生成唯一值,则可以在 INSERT 语句中使用 NEWID 函数,也可以将 NEWID 函数指定为列的默认值。 有关详细信息,请参阅 NEWID (Transact-SQL) 和 INSERT (Transact-SQL)。
SPARSE
指示列为稀疏列。 稀疏列已针对 NULL 值进行了存储优化。 不能将稀疏列指定为 NOT NULL。 有关稀疏列的其他限制和详细信息,请参阅使用稀疏列。<column_constraint>
有关列约束参数的定义,请参阅 column_constraint (Transact-SQL)。
注释
如果添加的列是 uniqueidentifier,则可以通过使用一个使用 NEWID() 函数的默认值对该列进行定义,以向表中的每个现有行的新列提供唯一标识符值。
数据库引擎 不强制在列定义中指定 DEFAULT、IDENTITY、ROWGUIDCOL 或列约束的顺序。
如果添加列导致数据行大小超过 8060 字节,ALTER TABLE 语句将失败。
示例
有关示例,请参阅 ALTER TABLE (Transact-SQL)。