我有SQL Server数据库,我想改变标识列,因为它开始了 有一个大数字10010,它与另一个表相关,现在我有200条记录,我想在记录增加之前修复这个问题。

更改或重置该列的最佳方法是什么?


当前回答

不允许更新: 但是你可以

用正确的键插入新数据 删除注册

Import:所有字段必须在insert into中声明 示例:reg 5必须更改为4:

    set IDENTITY_INSERT Gastos_ReclamacionCausa on
insert into Gastos_ReclamacionCausa
    (IDCausa,TextoCombo,Asunto,Mensaje,EsBaja)
select 4,TextoCombo,Asunto,Mensaje,EsBaja from Gastos_ReclamacionCausa where idcausa=5
delete from  Gastos_ReclamacionCausa where idcausa = 5
set IDENTITY_INSERT Gastos_ReclamacionCausa off

其他回答

不允许更新: 但是你可以

用正确的键插入新数据 删除注册

Import:所有字段必须在insert into中声明 示例:reg 5必须更改为4:

    set IDENTITY_INSERT Gastos_ReclamacionCausa on
insert into Gastos_ReclamacionCausa
    (IDCausa,TextoCombo,Asunto,Mensaje,EsBaja)
select 4,TextoCombo,Asunto,Mensaje,EsBaja from Gastos_ReclamacionCausa where idcausa=5
delete from  Gastos_ReclamacionCausa where idcausa = 5
set IDENTITY_INSERT Gastos_ReclamacionCausa off

如果您特别需要将主键值更改为不同的数字(例如123 -> 1123)。identity属性阻止更改PK值。Set Identity_insert将不起作用。如果您有级联删除,则不建议执行插入/删除操作(除非您关闭了引用完整性检查)。

编辑:新版本的SQL不允许更改syscolumns实体,因此我的部分解决方案必须以艰难的方式完成。关于如何从主键中删除Identity,请参考这个SO: 从表中的列中删除Identity 这个脚本将在PK中关闭标识:

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

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增加1,000,000:

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

最后,重新启用引用完整性,然后重新启用主键上的Identity列。

注意:我看到有些人在这些问题上问为什么。在我的例子中,我必须将来自第二个生产实例的数据合并到主DB中,这样才能关闭第二个实例。我只需要所有操作数据的PK/ fk不发生冲突。元数据fk是相同的。

您还可以使用SET IDENTITY INSERT来允许您将值插入到标识列中。

例子:

SET IDENTITY_INSERT dbo.Tool ON
GO

然后你可以在单位列中插入你需要的值。

就我所见,有几种方法可以做到这一点。,但在我看来最好和最快的方法是以下一种:

标识列有一个计数器,它不一定与已注册的列相同,您可以使用以下SQL命令查看该计数器的值:

DBCC CHECKIDENT('tableName', NORESEED);

然后,如果你想编辑标识列,你将不能,但我建议在重新播种计数器到你需要的数字后,做一个新的寄存器。要重新播种计数器,使用以下命令:

DBCC CHECKIDENT('tableName', RESEED, desiredNumber);

我有类似的问题,我需要更新一些id,我所做的是(我需要增加他们10k):

set identity_insert YourTable ON

INSERT INTO YourTable 
   ([ID]
   ,[something1]
   ,[something2]
   ,[something3])
SELECT 
   ([ID] + 10000)
   ,[something1]
   ,[something2]
   ,[something3]) 
FROM YourTable
WHERE something1 = 'needs updeted id' 
   AND something2 = 'some other condition'

set identity_insert YourTable OFF

DELETE FROM YourTable 
WHERE ID >= 'your old ID From' 
   AND ID <= 'Your old ID To' 

就是这样。希望你能理解这个逻辑,在我的情况下,还有PK-FK键与其他表连接,这意味着我必须更新它们,在我可以从“YourTable”原始行删除之前。

我知道这个问题已经有答案了,我只是想以SQL查询为例,