更新标识列中的值

时间:2010-10-16 02:41:45

标签: sql sql-server tsql

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

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

但我回来了

  

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

5 个答案:

答案 0 :(得分:58)

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

为此,您需要设置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)并使事情变得更复杂......]

答案 1 :(得分:10)

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

设置Identity_Insert [ColumnName] On 插入先前存储在该记录中的标识和其他信息 设置Identity_Insert [ColumnName] Off

答案 2 :(得分:10)

如果您尝试更新标识列,可以采用以下方法:

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

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

答案 3 :(得分:2)

您还可以使用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

答案 4 :(得分:0)

如果你想重新枚举一个身份字段的值,因为例如值已经疯了,只需按照以下步骤操作:

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

    标记(身份)为NO (您的身份字段仍为PK)

    关闭并保存设计

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

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

    关闭桌子,你就完成了。