Sql server 如何重置SQL Server表列中的标识?
Sql server 如何重置SQL Server表列中的标识?,sql-server,Sql Server,如何在不删除表数据的情况下重置SQL表列中的标识?您可以使用重置命令 DBCC CHECKIDENT ('table_name', RESEED, 1) 语法 ('table_name',RESEED,1)其中“1”是您的重置点开始编号。新索引将从何处开始。正如Marc_通过重置标识评论的那样,您可能最终会出现重复记录问题 如果你仍然想重置身份,你可以在这里做什么 e、 g.让我们调用表A,在其中您要重置标识 只需创建一个名称不同的表,如表B与表a 现在将表A的数据复制到表B 现在截断或删除表
如何在不删除表数据的情况下重置SQL表列中的标识?您可以使用重置命令
DBCC CHECKIDENT ('table_name', RESEED, 1)
语法
('table_name',RESEED,1)其中“1”是您的重置点开始编号。新索引将从何处开始。正如Marc_通过重置标识评论的那样,您可能最终会出现重复记录问题 如果你仍然想重置身份,你可以在这里做什么 e、 g.让我们调用
表A
,在其中您要重置标识
只需创建一个名称不同的表,如表B
与表a
现在将表A
的数据复制到表B
现在截断或删除表A中的数据
并重置表A中的标识列
这是在不丢失任何数据或不出现任何重复记录问题的情况下重置标识的方法
这是实现你目标的一种方法吗
我不确定它是否正确请尝试此代码(代码中的必要注释):
——smple数据准备
--插入具有1到5个ID的值,删除前三个
创建表tbl(id int identity(1,1)主键,[name]char(1));
插入到tbl([名称])值中
('a')、('b')、('c')、('d')、('e');
从tbl中删除,其中id如果重置标识,则只重置发出新值的计数器-这不会更新现有行值!另外:如果您将计数器重置为1(或任何其他低值),您肯定会遇到重复的情况-因此,总的来说,想要重置标识值是一个非常糟糕的主意-您为什么要这样做?RESEED语句不会复制您的标识列,因为它只从上次记录的位置开始inserted@irfan_m “它只从上次插入记录的位置开始”是不正确的,它从种子位置开始。也就是说,它就像marc_说的那样工作。@Anjig你能澄清一下“不删除表数据”的意思吗?你是说你想“更新”吗“打开表,然后只为id
列指定不同的值?您能否确认没有外键引用此id
?如果需要,您没有正确使用标识。自动生成的标识值旨在用作代理键,因此最小值、最大值和间隙不应成为问题。此答案描述了如何将数据移动到不同的表中,以为其提供不同的标识值。鉴于OP声明“不删除表数据”,这意味着他们需要现有数据保持原样,我很难看出这会有什么帮助。
--smple data preparation
--insert values to have 1 through 5 IDs, delete first three
create table tbl(id int identity(1,1) primary key, [name] char(1));
insert into tbl ([name]) values
('a'),('b'),('c'),('d'),('e');
delete from tbl where id <=3
--create helper table to hold data from our table with updated IDs
create table #helpTmpTbl(id int, [name] char(1));
--updated IDs are obtained with ROW_NUMBER function
insert into #helpTmpTbl
select row_number() over (order by id), [name] from tbl
--here you are exposed to risk of losing data, so we need to use transaction
begin tran
begin try
--delete records from table
delete from tbl
--enable inserting identity column (and always remember to disable it!)
set identity_insert tbl ON
--insert rows with updated IDs
insert into tbl (id, [name])
select * from #helpTmpTbl
--disable inserting identity column
set identity_insert tbl OFF
--if everything is successful, commit transaction
commit tran
end try
begin catch
rollback tran
end catch
select * from tbl
--get rid of the helper table
drop table #helpTmpTb