将列更改为标识

时间:2015-10-07 15:06:44

标签: sql-server sql-server-2008 identity alter-table

我已经阅读了以下答案,一旦创建为常规int,就无法将列更改为identity。

Adding an identity to an existing column

How to Alter a table for Identity Specification is identity SQL Server

How to alter column to identity(1,1)

但问题是我有一个表已经迁移到一个新的表,其中ID从一开始就没有被声明为身份,因为很久以前用ID身份创建的旧表缺少行到期清除历史数据。据我所知,如果我在新表上添加一个新列作为标识,它将自动按顺序创建列,我需要保留旧表中的ID,因为已经有数据链接到这些的ID。

如何将我的ID列从新表中转换为标识但不按顺序转换,但是使用旧表中的ID?

3 个答案:

答案 0 :(得分:4)

您可以尝试这种方法:

  1. 使用SET IDENTITY_INSERT <new table> ON插入旧ID的行。这允许您插入自己的ID。
  2. 重新设置身份,将其设置为带有DBCC CHECKIDENT ('<new table>', RESEED, <max ID + 1>)最高ID值+1 。这将允许您的身份从最高ID和向前增加。
  3. 代码中有这样的东西:

    -- Disable auto increment
    SET IDENTITY_INSERT <new table> ON
    -- <INSERT STUFF HERE>
    SET IDENTITY_INSERT <new table> OFF
    
    -- Reseed Identity from max ID
    DECLARE @maxval Int
    SET @maxval = ISNULL(
    (
        SELECT
            MAX(<identity column>) + 1
        FROM <new table>
    ), 0)
    DBCC CHECKIDENT ('<new table>', RESEED, @maxval)
    

    编辑:当然,这种方法需要你的ID列和身份。

答案 1 :(得分:0)

如果您要在先前版本中复制的字段中没有空值,则可以通过执行最大(Id)选择来首先找出最大ID。然后使用SSMS添加新字段,当您将其设置为标识时,只需将SEED值设置为高于当前最大值的值,这样您就不会在新插入上发生冲突。

答案 2 :(得分:0)

我有一个过程,其中在源文件,CSV和生产表之间使用了临时表。临时表必须与CSV文件列匹配,此数据中没有PK。

要在Azure数据工厂发生故障之前和之后查找一组行,我将超过2,000,000行导入到临时表中。该过程在Azure中停止了1,500,000行。

错误是整数或字符串将被截断。

这行代码将PK添加到临时表并递增:

ALTER TABLE ##FLATFILETEMPBDI ADD ROWNUM INT IDENTITY

那将是获得行号的最简单解决方案。然后,我能够执行此查询以查找1,500,000前后的行:

SELECT  
ROWNUM
, PARTDESCRIPTION
, LEN(PARTDESCRIPTION) AS LENDESCR
, QUANTITY
, ONORDER
, PRICE
, MANUFACTURERPARTNUMBER

从## FLATFILETEMPBDI 1499990和1500005之间的行数

完美地工作-没打算这么简单,有人惊讶地看到带有IDENTITY的ALTER TABLE为我进行了编号。