如何在SQL Server中更新身份列?

287

我有一个SQL Server数据库,想要更改自增列的起始值,因为它从 10010 开始,并且与另一个表相关联。现在我有200条记录,希望在记录数量增加之前解决这个问题。

最好的方式是如何更改或重置此列?

21个回答

-1

如果您需要将主键值更改为不同的数字(例如123-> 1123)。身份属性会阻止更改PK值。设置Identity_insert无法正常工作。如果您有级联删除,则不建议进行插入/删除操作(除非关闭引用完整性检查)。

编辑:较新版本的SQL不允许更改syscolumns实体,因此我的解决方案的一部分必须通过艰难的方式完成。请参考以下SO以从主键中删除Identity: Remove Identity from a column in a table 此脚本将关闭主键上的Identity:

***********************

sp_configure 'allow update', 1
go
reconfigure with override
go


update syscolumns set colstat = 0 --turn off bit 1 which indicates identity column
where id = object_id('table_name') and name = 'column_name'
go


exec sp_configure 'allow update', 0
go
reconfigure with override
go

***********************

接下来,您可以设置关系,以便更新外键引用。否则,您需要关闭关系强制执行。此SO链接显示如何操作:如何使用T-SQL暂时禁用外键约束? 现在,您可以进行更新。我编写了一个简短的脚本,根据相同的列名编写所有更新SQL(在我的情况下,我需要将CaseID增加100万):
select 
'update ['+c.table_name+'] SET ['+Column_Name+']=['+Column_Name+']+1000000'
from Information_Schema.Columns as c
JOIN Information_Schema.Tables as t ON t.table_Name=c.table_name and t.Table_Schema=c.table_schema and t.table_type='BASE TABLE'
where Column_Name like 'CaseID' order by Ordinal_position

最后,重新启用引用完整性,然后重新启用主键上的标识列。
注意:我看到一些人在这些问题上问为什么。在我的情况下,我必须将第二个生产实例的数据合并到主数据库中,以便关闭第二个实例。我只需要所有操作数据的PK / FK不发生冲突。元数据FK是相同的。

1
无法工作。https://stackoverflow.com/questions/34336115/ad-hoc-updates-to-system-catalogs-are-not-allowed-in-sql-server-2012 - David Browne - Microsoft
这段代码在我测试时能够运行,因此我将其记录在 Stack Overflow 上。 - Ken Forslund
直接更新syscolumns从未得到支持,并且最后适用于SQL Server 2000。在SQL Server 2005中,syscolumns被视图所取代,现在您将会收到一个错误:不允许对系统目录进行即席更新。 您可以使用sp_helptext 'sys.syscolumns'查看视图文本。 - David Browne - Microsoft
在SQL2005上工作过。现在版本问题很重要,但下次先以此信息为主。要想在更新的版本上执行我提出的操作,可能需要克隆标识列并删除原始列,执行值更新,然后将替换列升级为标识列。 - Ken Forslund
刚在 SQL 2005 SP2 (9.00.3042.00) 上进行了测试,但出现了“不允许对系统目录进行即席更新”的错误。 - David Browne - Microsoft
我已更新文字,将人们引导到另一个SO上,以了解如何删除身份。放松。 - Ken Forslund

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接