我使用SQL Server 2008中,和我有一个包含约50研磨行的表。
该表包含一个类型的主标识列int
。
我想升级该列被bigint
。
我需要知道如何做,在一个快速的方式,不会让我的数据库服务器不可用,并且不会删除或破坏任何我的数据
我应该怎么做最好呢? 什么是这样做的后果是什么?
我使用SQL Server 2008中,和我有一个包含约50研磨行的表。
该表包含一个类型的主标识列int
。
我想升级该列被bigint
。
我需要知道如何做,在一个快速的方式,不会让我的数据库服务器不可用,并且不会删除或破坏任何我的数据
我应该怎么做最好呢? 什么是这样做的后果是什么?
那么,它不会是一个quick'n'easy办法做到这一点,真的....
我的做法是这样的:
创建具有相同结构的新表-除了ID
列是BIGINT IDENTITY
代替INT IDENTITY
---- [把你的服务器为独家单用户模式在这里; 用户无法]使用你的服务器从这个角度----
找到并关闭所有的外键约束引用的表
转SET IDENTITY_INSERT (your new table) ON
插入从旧表中的行到新表
转SET IDENTITY_INSERT (your new table) OFF
删除旧表
新表重命名为旧表名
更新有FK引用到表使用的所有表BIGINT
代替INT
(这应该是可行的一个简单的ALTER TABLE ..... ALTER COLUMN FKID BIGINT
)
再重新创建所有外键关系
现在你可以再次服务器返回到正常的多用户使用
我在想什么?
为什么你就不能这样做:
ALTER TABLE tableName ALTER COLUMN ID bigint
我想尝试在测试环境中第一但这总是对我的作品
也许最好的方法是创建一个新表与BIGINT IDENTITY列,移动使用SET IDENTITY_INSERT的现有数据; 然后重命名表。 您将需要一个维护窗口期间,要做到这一点,就像你,如果你改变了Management Studio中的数据类型(这将同样的方式创建新表,移动数据,并阻止在这个过程中每个人)。
为什么会有人想使用BIGINT,而不是为智力的身份?
考虑这种情况:在一些环境中,包括在实际生产环境1个实例和其他几个实例您的数据库存在于(外种皮,B,C等),(QA A,B,C等),(演示A, B,C等),(UAT A,B,C等),(训练A,B,C等)上,并和...你甚至不想知道...
该数据库标识字段用于在一个唯一的号码传递给第三方供应商这是在非生产环境共享环境。 厂商为了设置多个环境,使公司拥有一个生产DB和一个对于所有其他收费的胳膊和一条腿。
所以......在测试时发生在非生产环境中,这些数字不能从你发生任何非生产环境中进行测试,而且测试包括压力测试...发送的数千行100的同时彼此交叉。
最糟糕的是......所有这些环境得到与生产,从而刷新标识字段被与任何在生产复位。 因此,人们必须跟踪在每个环境中使用,然后复位身份的情况以前从未使用的新的传播蔓延什么。 如果一个已经被数在这些环境中再次发送的第三方供应商将呕吐。 和供应商不愿或无法刷新或他们的最终重置这些数字。
这是一个现实世界的问题和当前的领域仍然是在所有环境中的int和跟踪这些利差是每季度更新或每当有人做了巨大的压力测试数以千计的交易100的管理。
因此,在10年左右这个身份将不得不更新到BIGINT或有人会说服第三方供应商来刷新他们的结局。
哦,是的,管理层可以直到一切都轰然倒下突然给它一个老鼠的屁股。
然后HACK “ALTER TABLE表名ALTER COLUMN ID BIGINT” 会做得很好。 空间和索引处理是便宜!