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

Updating identity column in SQL Server and setting the seed starting value

我有一个 table 填充了数据,其中一列 - TrackingNumber - 是一个整数值。我收到了将其更改为自动递增并让它以 1000000 开始标识种子的请求。我知道我无法将列更改为现有 table 中带有数据的标识列,所以我有两个选项:要么创建一个全新的 table,然后将数据从旧的 table 移动到新的 table 中,要么添加一个新的标识列并使用旧列中的数据更新它。

问题是我需要保留 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 步中遇到错误 - 使用旧列中的值更新新列:"Cannot update identity column 'TrackingNumber2'"

谁能推荐解决方法?

您只需为此 table 设置 identity_insert 即可更新值。确保在完成更新后将其关闭。 :)

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

确定您需要使用标识列吗?还有其他选择。例如,由于 SQL Server 2012(还有 Azure),这些东西称为序列。您可以定义一个序列以您喜欢的任何数字开始:

create sequence dbo.TrackingSequence
as int
  start with 1000000
  increment by 1
  no maxvalue
  no cycle
  no cache

然后,您可以更改 table,使相关列的默认值 defaults 来自序列:

alter table dbo.MyTable 
  add constraint [MyTable.TrackingNumber.Default.TrackingSequence]
    default( next value for dbo.TrackingSequence ) for TrackingNumber

(如果该列已有默认值,您需要先将其删除 - 在单独的语句中。)

序列的工作方式很像标识,但您不必破坏现有值或列定义本身。

唯一的技巧是记住不要指定 TrackingNumber 的值,让数据库做它的事情。

序列很酷,因为您可以让多个 table 使用一个序列,与过去的替代方案相比,您的数据库范围内的唯一 ID 稍微短一些。对于这样的应用程序,您最好使用 bigint 列 - 或者知道所讨论的 tables 不会太长。

我最终创建了一个新的 table 并在其中移动了数据