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

Posted

技术标签:

【中文标题】在 SQL Server 中将 int 主键转换为 bigint【英文标题】:Converting int primary key to bigint in Sql Server 【发布时间】:2011-03-28 15:21:49 【问题描述】:

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

DEV 中的实验表明,这不像更改列那么简单,因为我们需要删除索引然后重新创建它。到目前为止,在 DEV(比 PROD 稍逊)中,指数的下降在 1 个半小时后还没有结束。该表 24/7 全天候运行,无法长时间离线。

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

有其他选择吗?

编辑:附加信息:

主键是集群的。

【问题讨论】:

你的PK也是你的集群密钥吗? 【参考方案1】:

您可以尝试分阶段的方法。

    创建一个新的 bigint 列 创建插入触发器以使新条目与 2 列保持同步 执行更新以使用转换后的值填充 bigint 列中的所有空值 将表上的主索引从旧的 id 列更改为新的列 指向任何 FK 和查询以使用新列 将新列更改为您的标识列,并从 #2 中删除插入触发器 删除旧的 ID 列

你应该最终将痛苦分散到这 7 个步骤上,而不是一次全部完成。

【讨论】:

只是补充一点,FK 可以指向唯一索引,而不仅仅是 PK,所以 4 并不是绝对必要的 您可能希望将新的 PK 设置为在某个时间点进行集群。可能在第 4 步或第 6 步。 你是如何完成#6的?【参考方案2】:

为新行创建一个具有较长数据类型的并行表并合并结果?

【讨论】:

【参考方案3】:

我要做的就是将数据复制到具有所需结构的新表中(仅限主键/集群键,完成后非集群键/FK)。如果您没有空间,您可以 bcp 出数据并重新输入。您可能需要中断应用程序才能做到这一点。

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

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

【讨论】:

以上是关于在 SQL Server 中将 int 主键转换为 bigint的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 存储过程中将 varchar 转换为 int 时出错

在 SQL Server 中将空字符串转换为 INT

在 SQL Server Compact Edition 中将实体框架代码中的主键首先播种为 0

在sql server中将数据和时间转换为数字

如何在sql server中将列转换为行

如何在 SQL Server 中将行动态转换为列