指定列的默认值

适用于: SQL Server 2016(13.x)及更高版本 Azure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics 平台系统 (PDW)Microsoft Fabric 中的 SQL 数据库

可使用 SQL Server Management Studio (SSMS) 指定将在表列中输入的默认值。 可使用对象资源管理器或执行 Transact-SQL 来设置默认值。

如果没有分配默认值到列,并且用户将该列保留为空白,则:

  • 如果设置了允许 null 值的选项,则将向该列中插入 NULL

  • 如果未设置允许 null 值的选项,该列将保留为空,但用户或应用程序在为该列提供值之前无法插入该行。

可以对各种任务使用默认约束来确保数据库级的数据一致性:

  • 在插入时将“active”或“enable”列的行值设置为 1
  • 将日期字段的行值设置为当前日期。
  • 将字段的行值设置为确定性系统函数,例如,DB_NAME()

限制

在开始之前,请注意以下限制和局限:

  • 如果“默认值”字段中的项替换绑定的默认值(以不带圆括号的形式显示),则将提示解除对默认值的绑定,并将其替换为新的默认值。

  • 若要输入文本字符串,请将值括在单引号 (') 中。 不要使用双引号 ("),因为它们是为带引号的标识符保留的。

  • 若要输入数值默认值,请输入数值并且不要用引号将值括起来。

  • 若要输入对象/函数,请输入对象/函数的名称并且不要用引号将名称括起来。

  • 在 Azure Synapse Analytics 中,只有常数可以用于默认约束。 表达式不能用于默认约束。

权限

本文中描述的操作要求对表具有 ALTER 权限。

使用 SQL Server Management Studio 指定默认值

可以使用 SSMS 中的对象资源管理器指定表列的默认值。 为此,请按照以下步骤操作:

  1. 连接到 SSMS 中的 SQL Server 实例。

  2. 在对象资源管理器中,右键单击要更改其小数位数的列所在的表,再选择“设计”

  3. 选择要为其指定默认值的列。

  4. “列属性” 选项卡中,在 “默认值或绑定” 属性中输入新的默认值。

    若要输入数值默认值,请输入该数字。 对于对象或函数,请输入其名称。 对于字母数字默认值,请输入该值,两边用单引号引起来。

  5. 在“文件”菜单上,选择“保存table_name” 。

使用 Transact-SQL 指定默认值

可通过多种方法使用 T-SQL 来指定列的默认值。 在以下每个示例中,可以通过以下步骤打开新的 Transact-SQL 查询。

  1. “对象资源管理器” 中,连接到 数据库引擎的实例。

  2. 在标准栏上,选择“新建查询” 。

  3. 将示例复制并粘贴到查询窗口中,然后选择“执行”。

使用命名约束

使用数据库项目时,建议使用名称来创建约束。 否则,默认约束会使用系统生成的名称,具体名称在创建数据库对象的每个 SQL Server 环境中将有所不同。

CREATE TABLE dbo.doc_exz (
    column_a INT,
    column_b INT CONSTRAINT DF_Doc_Exz_Column_B DEFAULT 50
);

使用 ALTER TABLE

可以将命名约束添加到具有 ALTER TABLE 的现有表。

CREATE TABLE dbo.doc_exz (
    column_a INT,
    column_b INT
); -- Allows nulls.
GO

INSERT INTO dbo.doc_exz (column_a)
VALUES (7);
GO

ALTER TABLE dbo.doc_exz
ADD CONSTRAINT DF_Doc_Exz_Column_B DEFAULT 50 FOR column_b;
GO

使用 CREATE TABLE

可以使用 CREATE TABLE 创建具有默认约束的新表。

CREATE TABLE dbo.doc_exz (
    column_a INT,
    column_b INT CONSTRAINT DF_Doc_Exz_Column_B DEFAULT 50
);

设置创建日期

以下示例使用 sysdatetimeoffset() 系统函数以创建行时的日期填充 dateinserted 列的行值。

CREATE TABLE dbo.test (
    id INT identity(1, 1) NOT NULL CONSTRAINT PK_test PRIMARY KEY
    ,date_inserted DATETIMEOFFSET(2) NOT NULL CONSTRAINT DF_test_date_inserted DEFAULT(sysdatetimeoffset())
);

更新行时,默认约束不会更改。 要在每次修改行时更新值,请考虑使用触发器时态表计算列rowversion 二进制字符串。 考虑通过执行存储过程来插入行,而不是直接插入行。这样存储过程可以强制执行业务逻辑、默认值和其他数据一致性规则。

若要检测更改的行,请考虑更改数据捕获 (CDC)更改跟踪时态表账本表