我正在使用SQL Server 2008,有一个包含约五千万行数据的表。
该表包含一个名为identity的主键列,类型为int
。
我希望将该列升级为bigint
类型。
我需要知道如何快速实现此操作,不会使我的数据库服务器不可用, 也不会删除或破坏任何数据。
我应该如何最好地执行此操作?这样做会有什么后果?
我正在使用SQL Server 2008,有一个包含约五千万行数据的表。
该表包含一个名为identity的主键列,类型为int
。
我希望将该列升级为bigint
类型。
我需要知道如何快速实现此操作,不会使我的数据库服务器不可用, 也不会删除或破坏任何数据。
我应该如何最好地执行此操作?这样做会有什么后果?
嗯,这并不是一种快速简单的方法...
我的做法是:
创建一个结构相同但 ID
列为 BIGINT IDENTITY
而不是 INT IDENTITY
的新表
----[ 将你的服务器置于独占单用户模式; 此时用户无法使用你的服务器 ]----
找到并禁用所有引用原表的外键约束
打开 SET IDENTITY_INSERT (your new table) ON
将旧表中的行插入到新表中
关闭 SET IDENTITY_INSERT (your new table) OFF
删除旧表
将新表重命名为旧表名
将所有引用原表的表更新为使用 BIGINT
而不是 INT
(可以通过简单的 ALTER TABLE ..... ALTER COLUMN FKID BIGINT
完成)
重新创建所有外键关系
现在你可以将服务器返回到正常的多用户使用状态了
INT
对于您的数据库已经足够了! - marc_sSET IDENTITY_INSERT ON
,那么你将会插入完全相同的ID值到你的新表中! - marc_s我错过了什么?
为什么你不能就这样做:
ALTER TABLE tableName ALTER COLUMN ID bigint
我想首先在测试环境下尝试一下,但这种方法对我总是有效。
最好的方法可能是创建一个带有BIGINT IDENTITY列的新表,使用SET IDENTITY_INSERT ON移动现有数据,然后重命名表格。您需要在维护窗口期间执行此操作,就像在Management Studio中更改数据类型时一样(这也会创建一个新表格,移动数据并阻止所有人进行操作)。
你可以像 @MobileMon 所说的那样使用 Alter 脚本来更改列,但是在删除约束之前不能这样做。除了 FK 约束之外,在更改列类型之前还必须删除 PK 约束!
另外还有另一种创造性的方法,如果 ID 数据不重要(没有 FK 等):
& 如果 ID 数据很重要:
为什么有人想要使用BigInt而不是Int作为IDENTITY?
考虑以下情况: 您的数据库存在于多个环境中,包括一个实例在生产环境中,以及其他几个实例在(TestA、B、C等)、(QA A、B、C等)、(Demo A、B、C等)、(UAT A、B、C等)、(Training A、B、C等)等等。你甚至不想知道...
这个数据库的IDENTITY字段用于向第三方提供商传递一个唯一的数字,该提供商是非生产环境中的共享环境。供应商会收取高昂的费用来设置多个环境,因此公司只有一个生产DB和其他所有环境都共用一个。
因此...当在非生产环境中进行测试时,这些数字永远不能从您正在测试的任何非生产环境中相互交叉。而且测试包括压力测试...每次发送数十万行。
最后...所有这些环境都将与生产环境一起刷新,因此身份字段会重置为生产环境中的任何内容。因此,必须跟踪每个环境中使用的传播方式,然后将IDENTITY重置为以前从未使用过的新传播方式。如果在这些环境中再次发送相同的编号,第三方供应商将抛出异常。而且该供应商不愿或无法在其端刷新或重置这些编号。