当前位置:  开发笔记 > 编程语言 > 正文

如何在SQL Server中的大表中添加NOT NULL列?

如何解决《如何在SQLServer中的大表中添加NOTNULL列?》经验,为你挑选了1个好方法。



1> DHornpout..:

我也为我的工作遇到了这个问题.我的解决方案是#2.

这是我的步骤(我正在使用SQL Server 2005):

1)使用默认值将列添加到表中:

ALTER TABLE MyTable ADD MyColumn varchar(40) DEFAULT('')

2)NOT NULL使用NOCHECK选项添加约束.该NOCHECK不会对现有值执行:

ALTER TABLE MyTable WITH NOCHECK
ADD CONSTRAINT MyColumn_NOTNULL CHECK (MyColumn IS NOT NULL)

3)在表格中逐步更新值:

GO
UPDATE TOP(3000) MyTable SET MyColumn = '' WHERE MyColumn IS NULL
GO 1000

update语句仅更新最多3000条记录.这允许当时保存一大块数据.我必须使用"MyColumn IS NULL",因为我的表没有序列主键.

GO 1000将执行前一个语句1000次.这将更新300万条记录,如果您需要更多,只需增加此数字.它将继续执行,直到SQL Server返回UPDATE语句的0条记录.


我不知道你可以在GO之后输入一个数字.你改变了我的世界.
值得一提的是,MSDN强烈反对使用`WITH NOCHECK`:"如果您不想验证针对现有数据的新CHECK或FOREIGN KEY约束,请使用WITH NOCHECK.除极少数情况外,我们不建议这样做.新约束将在所有后续数据更新中进行评估.添加约束时由WITH NOCHECK抑制的任何约束违规都可能导致将来更新失败,如果他们使用不符合约束的数据更新行.
可能值得将以下内容添加到此答案的底部,以将约束标记为已检查:ALTER TABLE MyTable WITH CHECK CHECK CONSTRAINT MyColumn_NOTNULL - http://sqlblog.com/blogs/hugo_kornelis/archive/2007/03/29/can-你,信任你,constraints.aspx
此外:"查询优化器不考虑使用NOCHECK定义的约束.在使用ALTER TABLE WITH CHECK CHECK CONSTRAINT ALL重新启用它们之前,将忽略这些约束."
[马丁史密斯显示为什么NOCHECK在这里是一个问题](http://dba.stackexchange.com/a/48936/1186).
推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有