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
相关产品推荐
相关产品推荐

