具有自动递增值的MS SQL更新列

时间:2015-07-29 08:37:21

标签: sql sql-server sql-server-2012

我最近将一些旧数据导入到新的SQL表中,忘了将ID列设置为自动增量。

现在我在名为ID的列中有几个" NULL"

有没有办法可以自动更新具有唯一ID的所有ID列? 可悲的是,我不知道如何

之后我将能够将列设置为INT和自动增量。

感谢您的帮助。

5 个答案:

答案 0 :(得分:5)

尝试在Sql Server 2012中使用序列对象

create Sequence Sq as int
minvalue 1
cycle;

update table set Column=NEXT VALUE FOR Sq where Column is null

答案 1 :(得分:4)

最简单的方法是删除旧的ID列并添加新的列ID:

  ALTER TABLE [dbo].[myTable] DROP COLUMN ID 
  ALTER TABLE [dbo].[myTable] ADD ID int IDENTITY

答案 2 :(得分:2)

您可以使用CTE(公用表表达式)来执行此操作:

;WITH cte AS
(
    SELECT  ROW_NUMBER() OVER (ORDER BY ColA) AS RN,
            ID,
            ColA
    FROM    dbo.YourTable
)

UPDATE  cte 
SET     ID = RN

在此示例中,新ID由ColA排序生成 - 但您可以按所需的任何列进行排序。

答案 3 :(得分:2)

不使用序列和手动设置起始值:

declare @MaxId int 

select @MaxId = max(id) from [TableA]

update [TableA] 
  set  @MaxId = id = @MaxId +1
where id is null

从2008年开始适用于所有版本的SQL Server。 Sqlfiddle

答案 4 :(得分:1)

如果当前ID列不重要且分配给ID列的值不相关,您可以尝试以下操作:

  1. 创建一个新的int identity(1,1)列(这将由MS SQLServer自动填充唯一值)
  2. 删除旧列
  3. (可选)将新创建的列重命名为旧名称。
  4. 示例脚本可能如下所示:

    // Create a new identity column    
    ALTER TABLE dbo.YourTable 
          ADD NewID INT IDENTITY(1,1);
        GO
    
    // Drop the old ID column
        ALTER TABLE dbo.YourTable
          DROP COLUMN OldID;
        GO
    
    // Rename the new column from 'NewID' to 'OldID'
        EXEC sp_rename 'YourDataBase.YourTable.NewID', 'OldID', 'COLUMN'; 
        GO
    

    当您的表具有基于旧ID列中的值的关系时,这将不起作用。