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

2024-01-05

要将 NOT NULL 列添加到包含许多记录的表中,需要应用 DEFAULT 约束。如果表非常大,此约束会导致整个 ALTER TABLE 命令需要很长时间才能运行。这是因为:

假设:

  1. DEFAULT 约束修改现有记录。这意味着数据库需要增加每个记录的大小,这会导致它将完整数据页上的记录转移到其他数据页,并且这需要时间。
  2. DEFAULT 更新作为原子事务执行。这意味着事务日志需要增长,以便在必要时可以执行回滚。
  3. 事务日志跟踪整个记录。因此,即使只修改单个字段,日志所需的空间也将基于整个记录的大小乘以现有记录的数量。这意味着,即使两个表的记录总数相同,向包含小记录的表添加列也会比向包含大记录的表添加列更快。

可能的解决方案:

  1. 吸起它并等待该过程完成。只要确保将超时时间设置得很长即可。这样做的问题是,根据记录的数量,可能需要几个小时或几天的时间才能完成。
  2. 添加列但允许 NULL。然后,运行 UPDATE 查询来设置现有行的 DEFAULT 值。不要执行更新*。一次更新一批记录,否则您最终会遇到与解决方案 #1 相同的问题。这种方法的问题在于,当您知道这是一个不必要的选项时,您最终会得到一个允许 NULL 的列。我相信有一些最佳实践文档指出,除非有必要,否则不应拥有允许 NULL 的列。
  3. 创建具有相同架构的新表。将列添加到该架构中。将原始表中的数据转移过来。删除原始表并重命名新表。我不确定这比#1 更好。

问题:

  1. 我的假设正确吗?
  2. 这些是我唯一的解决方案吗?如果是的话,哪一个最好?如果没有,我还能做什么?

我的工作也遇到了这个问题。我的解决方案是#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 条记录。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何向 SQL Server 中的大表添加 NOT NULL 列? 的相关文章

随机推荐

  • Jest:测试类型或 null

    我有一个测试 我想测试我收到的对象值类型是否与架构匹配 问题是对于某些键我可能会收到一些东西或 null 到目前为止我尝试过这个 const attendeeSchema birthDate expect extend toBeTypeOr
  • 更改nopCommerce的连接字符串?

    我正在使用 nopCommerce 需要删除 settings txt 文件中的连接字符串并插入 web config 文件 我怎样才能做到这一点 将连接字符串从 settings txt 移出并移入 web config 的最直接方法是修
  • 过滤日期在 AngularJS 中返回 NaN-NaN-NaN

    我在下面创建的过滤器适用于 Chrome 但不适用于 Firefox 我不明白为什么 myApp filter dateCustom filter function filter return function input input gt
  • 在 editorconfig 中对 const 和非常量私有成员使用不同的前缀

    我想将 m 用于非常量私有成员 将 c 用于常量私有成员 但是 据我所知 editorconfig 不允许我为非常量成员指定规则 无论一般私有成员或 const 成员的指定顺序如何 以下内容都不起作用 Prefix private prot
  • 分页符内部被忽略

    我从另一个页面动态添加 HTML 并设计其打印样式 然而 page break inside avoid 当应用于我的元素 其中任何一个 时 即使它显示在样式中 打印时似乎也没有被考虑在内 我在 Windows 上使用 Chrome 31
  • 如何将 Reader 转换为 InputStream,将 Writer 转换为 OutputStream?

    有没有一种简单的方法可以避免处理文本编码问题 如果您从字符串开始 您还可以执行以下操作 new ByteArrayInputStream inputString getBytes UTF 8
  • 强制 java applet 在 32 位而不是 64 位 JRE 中运行

    我有一个Java小程序 在32位JDK 1 5 下设计 当在新的 MacOS 10 7 上部署它时 它运行不正确 因为在该系统中默认首选 64 位 JRE 有两种可供选择 32 位和 64 位 如果首先将首选顺序更改为 32 位 则一切正常
  • 计算C#中的代数表达式[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 计算代数表达式Z 其中n由用户输入 使用2个for循环来解决问题 到目前为止我的代码 using System using System
  • JVM内存管理和垃圾收集的书? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 任何人都可以吗建议一本书 或任何其他来源 将彻底揭示JVM 内存管理和垃圾收集的内部原理 优化 工作 循环引用 特性 各种 JVM 实现的
  • ListView OnItemClickListener 未监听

    我检查了之前有关此问题的所有问题 但没有一个对我有帮助 我的列表视图没有响应 我尝试更改它list setOnItemClickListener new ContactsListItemClickListener this to list
  • 线程是 UDP 服务器一次处理 40 个客户端的最佳方法吗?

    我正在开发 UDP 服务器 客户端应用程序 我希望我的服务器能够同时处理 40 个客户端 我曾想过在服务器端创建 40 个线程 每个线程处理一个客户端 客户端根据 IP 地址进行区分 每个唯一的 IP 地址都有一个线程 每当客户端向服务器发
  • 子高度为可滚动父内容高度的 100%

    请考虑这个小提琴 http jsfiddle net eKJAj http jsfiddle net eKJAj 我试图有一个绝对定位的 div 红线 来获取其 黄色 父级总高度的整个高度 不仅仅是父母的可见高度 如果你尝试小提琴 当你滚动
  • Git:如何直接从远程存储库存档?

    我通常在我的内部使用下面的命令project git获取指定目的地的存档 git archive master tar x C home kave site 我想知道是否可以直接从远程存储库存档到目标目录 我尝试了这样的事情 没有任何快乐
  • 将文件(图像)从 CacheDir 复制到 SD 卡

    我希望能够从 Android 设备的内部缓存移动或复制文件 并将其放入 SD 卡上的永久存储中 这是我到目前为止所拥有的 public void onClickSaveSecret View v File image new File ge
  • 社会安全号码的 T-SQL 正则表达式 (SQL Server 2008 R2)

    我需要查找无效的社会安全号码varcharSQL Server 2008 数据库表中的字段 有效的 SSN 的定义格式为 数字是什么并不重要 只要它们符合 3 位破折号 2 位破折号 4 位数字 模式即可 我确实有一个有效的正则表达式 SE
  • 如果函数有副作用,可以优化掉吗?

    我想在主线程上初始化一些静态数据 int32 t GetFoo ptime t static HugeBarData data return data Baz t int main GetFoo Avoid data race on sta
  • Golang 中的“小于后接破折号”(<-) 运算符是什么?

    是什么 lt go语言中的运算符 在许多与 Go 相关的代码片段中都看到过这一点 但它的含义是什么 你已经有了答案 但这里是 将通道视为消息队列 如果通道位于左箭头 e lt q 如果通道位于左箭头运算符的左侧 则表示将一个条目入队 q l
  • Ant 目标失败:Antlib 或 Ivy 问题? [复制]

    这个问题在这里已经有答案了 可能的重复 Ivy 无法解决依赖关系 无法找到原因 https stackoverflow com questions 9853851 ivy fails to resolve a dependancy unab
  • 如何为HTML文本输入和下拉输入设置相同的宽度

    我有两个 HTML 元素 如下所示
  • 如何向 SQL Server 中的大表添加 NOT NULL 列?

    要将 NOT NULL 列添加到包含许多记录的表中 需要应用 DEFAULT 约束 如果表非常大 此约束会导致整个 ALTER TABLE 命令需要很长时间才能运行 这是因为 假设 DEFAULT 约束修改现有记录 这意味着数据库需要增加每