将identity列从int替换为bigint

Mat*_*n L 27 sql sql-server sql-server-2008

我正在使用SQL Server 2008,我有一个包含大约50毫米行的表.

该表包含类型的主标识列int.

我想将该列升级为bigint.

我需要知道如何以快速的方式做到这一点,这将不会使我的数据库服务器不可用,并且不会删除或破坏我的任何数据

我该怎么做才能做到最好?这样做会带来什么后果?

mar*_*c_s 26

嗯,这不会是一种快速的方式,真的....

我的方法是:

  1. 创建一个具有相同结构的新表 - 除了ID列而BIGINT IDENTITY不是INT IDENTITY

    ---- [在这里将您的服务器置于独占的单用户模式; 用户不能从这一点开始使用你的服务器] ----

  2. 查找并禁用引用表的所有外键约束

  3. SET IDENTITY_INSERT (your new table) ON

  4. 将旧表中的行插入新表中

  5. SET IDENTITY_INSERT (your new table) OFF

  6. 删除旧表

  7. 将新表重命名为旧表名

  8. 更新所有对您的表有FK引用的表BIGINT而不是INT(应该可以简单地使用ALTER TABLE ..... ALTER COLUMN FKID BIGINT)

  9. 再次重新创建所有外键关系

  10. 现在,您可以再次将服务器恢复为正常的多用户使用状态

  • 注意:如果没有(1)使服务器从步骤2到9不可用,则无法完成此操作.或者(2)由于缺少FK查找和验证,可能会在更改期间对所有数据进行修改. (2认同)
  • 我正在研究一个应该很快处理这些数字的项目......问题是我正在使用整个项目的行标识,并且偶尔会删除一些行...所以重新插入所有的数据到新表会给我带来不同的信息...... (2认同)

Mob*_*Mon 16

我错过了什么?

为什么你不能这样做:

ALTER TABLE tableName ALTER COLUMN ID bigint
Run Code Online (Sandbox Code Playgroud)

我想首先在测试环境中尝试它,但这总是适合我

  • 您缺少的点是1)如果该表具有大量记录,该查询将永远运行并且还增加mdf/ldf文件大小2)处理FK场景. (3认同)

Aar*_*and 8

可能最好的方法是创建一个带有BIGINT IDENTITY列的新表,使用SET IDENTITY_INSERT ON移动现有数据; 然后重命名表.您需要在维护窗口期间执行此操作,就像在Management Studio中更改数据类型一样(类似地创建新表,移动数据,并阻止过程中的每个人).