【问题标题】:Update values in identity column更新标识列中的值
【发布时间】:2025-11-22 13:35:01
【问题描述】:

如何覆盖 MSSQL 中的 identity 列?我试过了:

    SET IDENTITY_INSERT GeoCountry ON
    UPDATE GeoCountry SET CountryID = 18 WHERE CountryID = 250

但我得到了一个

第 2 行:无法更新标识列“CountryID”。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    您正在尝试执行更新,而不是插入新行。

    为此,您需要将 identity_insert 设置为 ON 将要更新的行复制到具有新 ID 值的新行,然后删除旧行(假设没有 FK 引用它)

    类似的东西:

    set identity_insert GeoCountry on
    go
    
    insert into GeoCountry (all columns including IDentity column) 
         select 18, (all columns except IDentity column)
         from GeoCountry where CountryID = 250 
    
    -- Delete will only work if no referencing FK's
    delete GeoCountry where CountryID = 250
    
    set identity_insert GeoCountry off
    go
    

    [鉴于您正在尝试更新它,这表明它仍在使用中(即通过引用 FK),这使事情变得更加复杂......]

    【讨论】:

    • 它也对我有用,但括号中的部分首先令人困惑。因此更精确一点:插入 GeoCountry (column1, column2, columnN) select 18, column2, columnN from GeoCountry where CountryID = 250
    【解决方案2】:

    您无法更新 SQL Server 中的标识列。您必须删除原始记录,然后插入带有标识值的记录,因为不支持更新标识值。

    设置 Identity_Insert [ColumnName] On 插入先前存储在该记录中的身份和附加信息 设置 Identity_Insert [ColumnName] 关闭

    【讨论】:

    • +1 IMO 这是正确的答案。当提出“我如何更新标识值”这个问题时,一个重要的细节是您实际上不能更新该值,但必须删除并重新插入。接受的答案在这方面失败了。
    【解决方案3】:

    如果您尝试更新标识列,这是一种可能的方法:

    • 在 SQL Server Management Studio 中,在设计视图中打开表,禁用列上的“标识规范 > 是标识”
    • 执行更新
    • 在列上启用“身份规范 > 是身份”

    执行SELECT IDENT_CURRENT('<table name>') 以查看它是否返回表中当前存在的最高 id。

    【讨论】:

    • 如果您有具有级联更新的外键,则此方法是更好的方法,因为您可以“免费”获得更新。
    【解决方案4】:

    您也可以在一个语句中使用 delete into 来执行此操作,这有助于消除复制/移动行数据的任何错误,例如

    set identity_insert [dbo].[MyTableName] on
    
    delete from [dbo].[MyTableName]
    output 
    <new-id-value-here>,
    [deleted].[Col1], 
    [deleted].[Col2], 
    [deleted].[Col3], 
    into 
    [dbo].[MyTableName] (
    [IdColumnName], 
    [Col1], 
    [Col2], 
    [Col3])
    where
    [IdColumnName]=<old-id-value-here>
    
    set identity_insert [dbo].[MyTableName] off
    

    【讨论】:

      【解决方案5】:

      如果你想重新枚举一个身份字段的值,例如这些值已经疯了,只需执行以下操作:

      • 在设计模式下打开表格 点击身份规范

        标记(是身份)为否 (你的身份字段还是PK)

        关闭并保存设计

      • 在编辑模式下打开表格 根据需要更改身份字段的值 (请注意,您不能有重复的值)

      • 关闭表格并在设计模式下再次打开 将您的身份字段(即身份)替换为是。

        关闭表格,您就完成了。

      【讨论】:

        最近更新 更多