在Sql Server中将int主键转换为bigint

时间:2011-03-28 15:21:49

标签: sql-server sql-server-2008

我们有一个包含7.7亿行和更改的生产表。我们希望(/需要?)将主ID列从int更改为bigint以允许将来增长(并避免在32位整数空间耗尽时突然停止)

DEV中的实验表明,这并不像改变列那么简单,因为我们需要删除索引然后重新创建它。到目前为止DEV(比PROD稍微谦逊)指数的下降在1个半小时后还没有完成。这个表每周7天,每天24小时播放,让它离线这么长时间不是一种选择。

还有其他人不得不处理类似情况吗?你是怎么做到的?

有替代方案吗?

修改:其他信息:

  • 主键是群集。

3 个答案:

答案 0 :(得分:12)

你可以尝试一种分阶段的方法。

  1. 创建一个新的bigint列
  2. 创建插入触发器以使新条目与2列
  3. 保持同步
  4. 执行更新以使用转换后的值
  5. 填充bigint列中的所有空值
  6. 将表格中的主要索引从旧的ID列更改为新的
  7. 指出任何FK和查询以使用新列
  8. 将新列更改为您的标识列,并从#2
  9. 中删除插入触发器
  10. 删除旧ID列
  11. 你最终应该将痛苦分散在这七个步骤上,而不是立即全部击中。

答案 1 :(得分:1)

创建一个并行表,其中包含新行的较长数据类型和UNION结果?

答案 2 :(得分:0)

我必须做的是将数据复制到具有所需结构的新表中(仅限主要/群集密钥,非群集密钥/ FK一旦完成)。如果您没有房间,您可以bcp out数据并重新登录。您可能需要应用程序中断才能实现此目的。

什么不起作用:alter table由于主键,Orderhistory改变了列ID bigint。不要删除密钥和更改列,因为您只需填写日志文件并花费比copy / bcp更长的时间。

永远不要使用SSMS工具设计器来更改列属性,它会将表复制到临时表中,然后在完成后重命名。查找alter table alter column语法并使用它,如果你修改了一个位于表中间的更宽的列,可能会在完成后进行碎片整理。