我有一张包含四千万条记录的表格,我需要在该表格中添加一个新的INT NOT NULL列,并将默认值设置为0。
使用以下方式添加此列:
ALTER TABLE myTable ADD NewColumnID int NOT NULL CONSTRAINT DF_Constraint DEFAULT 0
它将NewColumnID设置为0,适用于所有记录。当在拥有4000万条记录的生产表上运行此查询时,会花费很长时间吗?因为我知道执行以下操作需要非常长的时间:
UPDATE myTable SET NewColumnID = 0
更新:2020年1月5日:
我已经有一段时间没登录我的stackoverflow帐户了。我注意到了这个问题,这是我在2013年发布的。我因为这个问题受到了一些负面评价,现在我能够理解为什么会这样。我不得不反复阅读才明白自己当时在问什么以及答案如何适用。考虑到它已经被浏览超过6k次,也许(很抱歉是在7年之后)提供更多上下文信息是值得的。
允许我澄清一下问题:
我曾在银行软件提供商工作。我们在全球范围内有各种各样的客户,并正在推出一个大型软件更新,需要向我们的软件所使用的现有表中添加一个新列。这个特定的表通常相当大,具体取决于银行的规模。要求是,在第一次添加列时,为所有现有记录分配特定的ID,之后表中的所有新条目都将恢复为“0”的值。
因此......在测试阶段,我们注意到在升级脚本中包含以下内容需要花费近一小时处理4000万条记录:
ALTER TABLE myTable ADD NewColumnID int NOT NULL CONSTRAINT DF_Constraint DEFAULT 0
UPDATE myTable SET NewColumnID = 50
上面的示例将添加新列,然后使用NewColumnID = 50更新所有现有记录。这是在其运行的硬件上花费近一个小时的原因。我知道这将根据客户基础设施的不同而大大变化。
问题的原因是想看看是否有更快的方法来完成上述操作。
让我澄清答案:
我完全理解为什么我的答案没有意义,但希望以下解释能够帮助:
您可以创建一个具有默认值的约束条件,并将要更新的值分配给所有现有记录,而不是添加列然后运行更新查询。创建列将自动插入此值:
ALTER TABLE myTable ADD CompanyID int NOT NULL CONSTRAINT DF_Constraint DEFAULT 1 (takes about 1min to complete)
这本质上就是“一石二鸟”的效果。这个查询在大约1分钟内完成,而不是一个小时(在同一服务器上执行)。现在需要添加一个新列,其默认的id = x(每个客户端都不同)用于所有现有记录,因此恢复了 DEFAULT 0 约束,以便如果未传递值,则所有新插入的记录将假定为0。 因此引用:
然后只需将默认值设置为0即可。现在表中的所有记录都将具有CompanyID = 1。BOOM!
抱歉...这是7年前的事情,现在看起来真的很愚蠢 :) 但是谁知道,也许这可以帮助具有需要创造性hack的愚蠢要求的其他人 :)!