【问题标题】:Updating identity column in SQL Server and setting the seed starting value更新 SQL Server 中的标识列并设置种子起始值
【发布时间】:2015-09-02 20:46:23
【问题描述】:

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

谁能推荐一个解决方法?

【问题讨论】:

    标签: sql-server azure-sql-database


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您是否确定需要使用标识列?有替代方案。例如,自 SQL Server 2012(以及 azure 也是)以来,这些东西称为序列。您可以定义一个序列以从您喜欢的任何数字开始:

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

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

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

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

      序列的工作原理很像身份,但您不必破坏现有值或列定义本身。

      唯一的窍门是记住不要指定 TrackingNumber 的值,让数据库自己做。

      序列很酷,因为您可以拥有一个供多个表使用的序列,与过去的替代方法相比,您可以在数据库范围内提供更短的唯一 ID。对于这样的应用程序,您可能最好使用 bigint 列 - 或者知道有问题的表不会很长。

      【讨论】:

      • 我在 Oracle 中使用过序列,但在 SQL Server 中不知道它们。谢谢!
      • 在我添加序列之前,该列的现有值会发生什么变化
      • 没什么。这是最好的部分。如果您有引用 TrackingNumber 列的外键,它们仍然很好。我假设 1000000 是为了让您超越所有现有值。
      • 我实际上找到了另一种方法——创建一个新表并在其中移动数据
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2017-07-04
        • 1970-01-01
        • 2016-10-18
        • 2013-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-13
        • 1970-01-01
        相关资源
        最近更新 更多