如何为SQL Server现有表添加列并同时填充数据
给SQL Server现有表添加带默认值列的测试总结
刚好解决了这个困扰的问题,我测试了几种不同的语法,整理下对应的效果:
首先说最开始遇到的情况:当执行ALTER TABLE LanguagePacks ADD LgDt DATETIME DEFAULT GETDATE()时,现有行的新列会是NULL,只有后续INSERT的新行才会自动填充GETDATE()的默认值——这是因为普通的DEFAULT子句不会触发对现有行的赋值操作。
下面是我实际测试的几种语句和结果:
允许为NULL + 普通DEFAULT(无WITH VALUES)
ALTER TABLE ##LangPak ADD LtDt2 DATETIME DEFAULT GETDATE()结果:现有行的
LtDt2字段为NULL,新插入的行自动填充执行INSERT时的当前时间。允许为NULL + DEFAULT WITH VALUES
ALTER TABLE ##LangPak ADD LtDt4 DATETIME NULL DEFAULT GETDATE() WITH VALUES结果:现有行的
LtDt4会被设置为执行这条ALTER语句时的当前时间,新插入行同样会自动使用默认值填充。NOT NULL + DEFAULT
ALTER TABLE ##LangPak ADD LtDt DATETIME NOT NULL DEFAULT GETDATE()结果:因为列不允许为NULL,SQL Server会自动用默认值填充所有现有行的
LtDt字段,新插入行也会自动使用默认值,这里不需要额外加WITH VALUES。直接添加NOT NULL列(无DEFAULT)
ALTER TABLE ##LangPak ADD LtDt1 DATETIME NOT NULL结果:触发报错
Msg 4901,因为现有行没有值可以填充这个非空列,SQL Server不允许这种操作,必须搭配默认值,或者先设为NULL填充数据后再修改约束。
感谢各位的解答,这些方法都已经生效,尝试了所有建议收获颇丰。由于该问题被标记为重复,我无法将此编辑内容发布为答案,所以整理在这里分享给大家。
内容的提问来源于stack exchange,提问作者LonelyRogue
相关产品推荐
相关产品推荐

