column_definition (Transact-SQL)

指定使用 ALTER TABLE 添加到表中的列的属性。

主题链接图标 Transact-SQL 语法约定

语法

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)

请参阅

参考

ALTER TABLE (Transact-SQL)