column_definition (Transact-SQL)
指定使用 ALTER TABLE 添加到表的列的属性。
语法
column_name [ type_schema_name. ] type_name
[
( { precision [ , scale ] | max |
[ { CONTENT | DOCUMENT } ] xml_schema_collection } )
]
[ FILESTREAM ]
[
[ CONSTRAINT constraint_name ] DEFAULT constant_expression
[ WITH VALUES ]
| IDENTITY [ (seed , increment ) ] [ NOT FOR REPLICATION ]
]
[ ROWGUIDCOL ]
[ COLLATE < collation_name > ]
[ <column_constraint> [ ...n ] ]
参数
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
指定的数据类型的精度。有关有效精度值的详细信息,请参阅精度、小数位数和长度。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 列且不能更改相关的约束。ROWGUIDCOL 列只能在删除了最后一个 FILESTREAM 列后才能被删除。
当为某个列指定了 FILESTREAM 存储属性时,该列的所有值都将存储在文件系统上的 FILESTREAM 数据容器中。
有关如何使用列定义的示例,请参阅 FILESTREAM 存储入门。
[ 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 属性指定了该子句,则当复制代理执行插入操作时,标识列中的值不会增加。有关详细信息,请参阅使用 NOT FOR REPLICATION 来控制约束、标识和触发器。ROWGUIDCOL
指定该列是一个行全局唯一标识符列。ROWGUIDCOL 只能分配给 uniqueidentifier 列,并且每个表中只有一个 uniqueidentifier 列可以被指定为 ROWGUIDCOL 列。不能为用户定义数据类型分配 ROWGUIDCOL。ROWGUIDCOL 并不强制列中所存储值的唯一性。另外,该属性也不会为插入到表中的新行自动生成值。若要为每列生成唯一值,则可以在 INSERT 语句中使用 NEWID 函数,也可以将 NEWID 函数指定为列的默认值。有关详细信息,请参阅 NEWID (Transact-SQL) 和 INSERT (Transact-SQL)。
COLLATE < collation_name>
指定列的排序规则。如果未指定,则为该列分配数据库的默认排序规则。排序规则名称既可以是 Windows 排序规则名称,也可以是 SQL 排序规则名称。有关列表及详细信息,请参阅 Windows 排序规则名称 (Transact-SQL)和 SQL Server 排序规则名称 (Transact-SQL)。COLLATE 子句只能用于指定 char、varchar、nchar 和 nvarchar 数据类型的列的排序规则。
有关 COLLATE 子句的详细信息,请参阅 COLLATE (Transact-SQL)。
注释
如果添加的列是 uniqueidentifier,则可以通过使用一个使用 NEWID() 函数的默认值对该列进行定义,以向表中的每个现有行的新列提供唯一标识符值。
数据库引擎不强制在列定义中指定 DEFAULT、IDENTITY、ROWGUIDCOL 或列约束的顺序。