You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server 2019:为现有行设指定默认值,新行用系统函数

解决方案

问题出在一个数据库列只能绑定一个默认约束,你之前添加列时已经创建了默认约束,所以无法直接添加新的。按照以下步骤就能实现需求:

方法一:先填充现有行,再替换默认约束

1. 先添加列并填充现有数据(你已完成这一步)

执行初始语句,让现有行的time_ct和author被设置为指定值,同时创建临时默认约束:

ALTER TABLE [tpsone].[ss_auth]
    ADD [time_ct] DATETIME2 (7) NOT NULL 
        CONSTRAINT DF_ss_authi DEFAULT '0000-00-00 00:00:00.0000000';

ALTER TABLE [tpsone].[ss_auth]
    ADD [author] VARCHAR (200) NOT NULL 
        CONSTRAINT DF_ss_authii DEFAULT 'not_set';

2. 删除临时默认约束

删掉之前用来填充旧数据的默认约束,为新的默认规则腾出位置:

-- 删除time_ct的旧默认约束
ALTER TABLE [tpsone].[ss_auth]
DROP CONSTRAINT DF_ss_authi;

-- 删除author的旧默认约束
ALTER TABLE [tpsone].[ss_auth]
DROP CONSTRAINT DF_ss_authii;

3. 添加针对新行的默认约束

现在可以添加使用系统函数的默认约束,后续插入的新行会自动用GETDATE()和SUSER_SNAME()填充对应列:

ALTER TABLE [tpsone].[ss_auth]
    ADD CONSTRAINT DF_ss_auth_time_ct DEFAULT GETDATE() FOR [time_ct];

ALTER TABLE [tpsone].[ss_auth]
    ADD CONSTRAINT DF_ss_auth_author DEFAULT SUSER_SNAME() FOR [author];

方法二:分步更新(适合大表或需精细控制的场景)

如果你的表数据量很大,直接添加NOT NULL列可能引发性能问题,可以用更稳妥的分步操作:

1. 添加允许为空的列

ALTER TABLE [tpsone].[ss_auth]
ADD [time_ct] DATETIME2 (7) NULL,
    [author] VARCHAR (200) NULL;

2. 更新现有行的列值

UPDATE [tpsone].[ss_auth]
SET [time_ct] = '0000-00-00 00:00:00.0000000',
    [author] = 'not_set';

3. 修改列属性为NOT NULL

ALTER TABLE [tpsone].[ss_auth]
ALTER COLUMN [time_ct] DATETIME2 (7) NOT NULL;

ALTER TABLE [tpsone].[ss_auth]
ALTER COLUMN [author] VARCHAR (200) NOT NULL;

4. 添加新行的默认约束

ALTER TABLE [tpsone].[ss_auth]
    ADD CONSTRAINT DF_ss_auth_time_ct DEFAULT GETDATE() FOR [time_ct];

ALTER TABLE [tpsone].[ss_auth]
    ADD CONSTRAINT DF_ss_auth_author DEFAULT SUSER_SNAME() FOR [author];

内容的提问来源于stack exchange,提问作者jaxij

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 18:30:37