如何覆盖MSSQL中的identity
列?我试过了:
SET IDENTITY_INSERT GeoCountry ON
UPDATE GeoCountry SET CountryID = 18 WHERE CountryID = 250
但我回来了
第2行:无法更新标识列'CountryID'。
答案 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)
如果您尝试更新标识列,可以采用以下方法:
执行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)
关闭并保存设计
在编辑模式下打开表格 根据需要更改“标识”字段的值 (请注意,您不能拥有重复的值)
关闭表格并在设计模式下再次打开 将您的身份字段(身份)替换为是。
关闭桌子,你就完成了。