【问题标题】:MS SQL update column with auto incremented value具有自动递增值的 MS SQL 更新列
【发布时间】:2015-07-29 08:37:20
【问题描述】:

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

现在我在名为 ID 的列中有几个“NULL”。

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

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

感谢您的帮助。

【问题讨论】:

  • 你能给所有的行赋予新的id,还是你只想填写空值?
  • 您可以删除该列并将其重新创建为身份吗?然后将为所有行编号
  • @ZoharPeled 我只想填写 NULL 在列内的那些行

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


【解决方案1】:

尝试使用 Sequence Object for Sql Server 2012

create Sequence Sq as int
minvalue 1
cycle;

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

【讨论】:

  • 如果我从值 2892 开始会是什么样子?创建序列 SQ 作为 int minvalue 2892 ?另外我只想影响其中包含 NULL 的列
  • 如果您使用 2892 的起始值并且 int 的序列值已用尽,那么它将以最小 int 值 (-2147483648.) 序列对象开始 始终以它的最小值开始,因此使用起来更方便最小值@noa-dev
  • @noa-dev 您可以将 Null 条件用于更新语句。检查我更新的答案
  • 欢迎您@noa-dev
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您可以使用 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 排序生成的 - 但您可以按您想要的任何列排序。

    【讨论】:

      【解决方案4】:

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

      declare @MaxId int 
      
      select @MaxId = max(id) from [TableA]
      
      update [TableA] 
        set  @MaxId = id = @MaxId +1
      where id is null
      

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

      【讨论】:

        【解决方案5】:

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

        1. 创建一个新的 int identity(1,1) 列(这将由 MS SQLServer 自动填充唯一值)
        2. 删除旧列
        3. 可选择将新创建的列重命名为旧名称。

        示例脚本可能如下所示:

        // 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 列中的值的关系时,这将不起作用。

        【讨论】:

        • 谢谢 - 我的问题已经得到解答,如下所示:)
        猜你喜欢
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 2018-01-01
        • 2014-04-15
        • 2012-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多