更新SQL Server中的标识列并设置种子起始值

时间:2015-09-02 20:46:24

标签: sql-server azure-sql-database

我有一个填充数据的表,其中一列 - 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'”

有人可以推荐一种解决方法吗?

3 个答案:

答案 0 :(得分:1)

您只需要为此表设置identity_insert,以便更新值。完成更新后,请确保将其关闭。 :)

https://msdn.microsoft.com/en-us/library/ms188059.aspx

答案 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)

我最终创建了一个新表并在那里移动数据