适用于:SQL Server 2016 (13.x) 及以后版本
Azure SQL 数据库
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Microsoft Fabric 中的 SQL 数据库
可使用 SQL Server Management Studio (SSMS) 指定将在表列中输入的默认值。 可使用对象资源管理器或执行 Transact-SQL 来设置默认值。
如果没有分配默认值到列,并且用户将该列保留为空白,则:
如果设置了允许 null 值的选项,则将向该列中插入
NULL。如果未设置允许 null 值的选项,该列将保留为空,但用户或应用程序在为该列提供值之前无法插入该行。
可以对各种任务使用默认约束来确保数据库级的数据一致性:
- 在插入时将“active”或“enable”列的行值设置为
1。 - 将日期字段的行值设置为当前日期。
- 将字段的行值设置为确定性系统函数,例如,
DB_NAME()。
Limitations
在开始之前,请注意以下限制和局限:
如果“默认值”字段中的项替换绑定的默认值(以不带圆括号的形式显示),则将提示解除对默认值的绑定,并将其替换为新的默认值。
若要输入文本字符串,请将值括在单引号 (
') 中。 不要使用双引号 ("),因为它们是为带引号的标识符保留的。若要输入数值默认值,请输入数值并且不要用引号将值括起来。
若要输入对象/函数,请输入对象/函数的名称并且不要用引号将名称括起来。
在 Azure Synapse Analytics 中,只有常数可以用于默认约束。 表达式不能用于默认约束。
Permissions
本文中描述的操作要求对表具有 ALTER 权限。
使用 SQL Server Management Studio 指定默认值
可以使用 SSMS 中的对象资源管理器指定表列的默认值。 为此,请按照以下步骤操作:
连接到 SSMS 中的 SQL Server 实例。
在对象资源管理器中,右键单击要更改其小数位数的列所在的表,再选择“设计”。
选择要为其指定默认值的列。
在 “列属性” 选项卡中,在 “默认值或绑定” 属性中输入新的默认值。
若要输入数值默认值,请输入该数字。 对于对象或函数,请输入其名称。 对于字母数字默认值,请输入该值,两边用单引号引起来。
在“文件”菜单上,选择“保存table_name” 。
使用 Transact-SQL 指定默认值
可通过多种方法使用 T-SQL 来指定列的默认值。 在以下每个示例中,可以通过以下步骤打开新的 Transact-SQL 查询。
在 “对象资源管理器” 中,连接到 数据库引擎的实例。
在标准栏上,选择“新建查询” 。
将示例复制并粘贴到查询窗口中,然后选择“执行”。
使用命名约束
使用数据库项目时,建议使用名称来创建约束。 否则,默认约束会使用系统生成的名称,具体名称在创建数据库对象的每个 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)、更改跟踪、时态表或账本表。