【发布时间】: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
如何覆盖 MSSQL 中的 identity 列?我试过了:
SET IDENTITY_INSERT GeoCountry ON
UPDATE GeoCountry SET CountryID = 18 WHERE CountryID = 250
但我得到了一个
第 2 行:无法更新标识列“CountryID”。
【问题讨论】:
标签: sql sql-server tsql
您正在尝试执行更新,而不是插入新行。
为此,您需要将 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),这使事情变得更加复杂......]
【讨论】:
您无法更新 SQL Server 中的标识列。您必须删除原始记录,然后插入带有标识值的记录,因为不支持更新标识值。
设置 Identity_Insert [ColumnName] On 插入先前存储在该记录中的身份和附加信息 设置 Identity_Insert [ColumnName] 关闭
【讨论】:
如果您尝试更新标识列,这是一种可能的方法:
执行SELECT IDENT_CURRENT('<table name>') 以查看它是否返回表中当前存在的最高 id。
【讨论】:
您也可以在一个语句中使用 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
【讨论】:
如果你想重新枚举一个身份字段的值,例如这些值已经疯了,只需执行以下操作:
在设计模式下打开表格 点击身份规范
标记(是身份)为否 (你的身份字段还是PK)
关闭并保存设计
在编辑模式下打开表格 根据需要更改身份字段的值 (请注意,您不能有重复的值)
关闭表格并在设计模式下再次打开 将您的身份字段(即身份)替换为是。
关闭表格,您就完成了。
【讨论】: