我有一个填充数据的表,其中一列 - TrackingNumber - 是一个整数值。我已经请求将其更改为自动递增并让它以1000000启动身份种子。我知道我不能将列更改为包含数据的现有表中的标识列,因此我有两个选项:创建一个全新的表,然后将旧表中的数据移动到该新表中,或者添加一个新的标识列,并使用旧列中的数据对其进行更新。
问题是我需要保留TrackingNumber列中的所有现有值。我尝试过以下方法:
1) ALTER TABLE [dbo].[Table1]
ADD [TrackingNumber2] [bigint] IDENTITY (1000000, 1) NOT NULL
2) UPDATE [dbo].[Table1]
SET [TrackingNumber2]=[TrackingNumber]
3) ALTER TABLE [dbo].[Table1]
DROP COLUMN [TrackingNumber]
GO
4) EXEC sp_rename 'Table1.TrackingNumber2', 'TrackingNumber','COLUMN'
我在第2步时遇到错误 - 使用旧列中的值更新新列:“无法更新标识列'TrackingNumber2'”
有人可以推荐一种解决方法吗?
答案 0 :(得分:1)
您只需要为此表设置identity_insert,以便更新值。完成更新后,请确保将其关闭。 :)
答案 1 :(得分:0)
您确定是否需要使用标识列?还有其他选择。例如,自SQL Server 2012(以及azure)以来,有些这些东西称为序列。您可以定义一个序列,以您喜欢的任何数字开头:
create sequence dbo.TrackingSequence
as int
start with 1000000
increment by 1
no maxvalue
no cycle
no cache
然后,您可以更改表格,使得有问题的列的默认值默认值来自序列:
alter table dbo.MyTable
add constraint [MyTable.TrackingNumber.Default.TrackingSequence]
default( next value for dbo.TrackingSequence ) for TrackingNumber
(如果该列已有默认值,则需要先删除该值 - 在单独的语句中。)
序列与身份很相似,但您不必破坏现有值或列定义本身。
唯一的技巧是记住不要指定TrackingNumber的值,让数据库做它的事情。
序列很酷,因为您可以拥有一个由多个表使用的序列,从而使您的db-wide唯一ID比过去的替代品更短。对于这样的应用程序,使用bigint列可能会更好 - 或者知道有问题的表格不会非常长。
答案 2 :(得分:0)
我最终创建了一个新表并在那里移动数据