我已将记录插入SQL Server数据库表 . 该表定义了主键,并且自动增量标识种子设置为“是” . 这主要是因为在SQL Azure中,每个表都必须定义主键和标识 .
但由于我必须从表中删除一些记录,这些表的标识种子将受到干扰,并且索引列(以1为增量自动生成)将受到干扰 .
How can I reset the identity column after I deleted the records so that the column has sequence in ascending numerical order?
标识列不用作数据库中任何位置的外键 .
17 回答
最好尽可能使用 TRUNCATE 而不是删除所有记录,因为它也不使用日志空间 .
如果我们需要删除并需要重置种子,请始终记住,如果表从未填充过并且您使用了
DBCC CHECKIDENT('tablenem',RESEED,0)
,那么第一条记录将获得identity = 0,如msdn documentation所述运行此脚本以重置标识列 . 您需要进行两项更改 . 将tableXYZ替换为您需要更新的任何表 . 此外,需要从临时表中删除标识列的名称 . 这是一张包含35,000行和3列的表格 . 显然,备份表并首先在测试环境中尝试此操作 .
其中0是
identity
起始值对于完整的DELETE行并重置IDENTITY计数,我使用此(SQL Server 2008 R2)
虽然大多数答案建议重新设置为0,但很多时候我们需要重新调整到下一个可用的ID
这将检查表并重置为下一个ID .
发出2命令可以做到这一点
第一个将身份重置为零,然后下一个将其设置为下一个可用值 - jacob
使用新ID重置标识列...
这会将当前标识值设置为0 .
插入下一个值时,标识值将增加到1 .
我试了
@anil shahs
回答它重置了身份 . 但是当插入一个新行时,它得到了identity = 2
. 所以我改为将语法改为:然后第一行将获得identity = 1 .
应该注意的是,如果所有数据都是通过
DELETE
从表中删除(即没有WHERE
子句),那么只要a)权限允许它,并且b)没有引用该表的FK(出现在这里是这样的情况),使用TRUNCATE TABLE
将是首选,因为它更有效DELETE
并同时重置IDENTITY
种子 . 以下详细信息来自TRUNCATE TABLE的MSDN页面:以下是:
变得公正:
有关限制等的其他信息,请参阅
TRUNCATE TABLE
文档(上面链接) .DBCC CHECKIDENT管理命令用于重置身份计数器 . 命令语法是:
例:
以前版本的Azure SQL数据库不支持它,但现在支持 .
请注意,
new_reseed_value
参数因SQL Server版本according to documentation而异:但是, I find this information misleading (实际上只是普通错误)因为观察到的行为表明至少SQL Server 2012仍然使用new_reseed_value当前的增量值逻辑 . 微软甚至与在同一页面上找到的自己的
Example C
相矛盾:尽管如此,这都为新的SQL Server版本留下了不同行为的选项 . 我想在确保微软在自己的文档中清理内容之前,唯一可以确定的方法是在使用前进行实际测试 .
@jacob
为我工作,我只需要先从表中清除所有条目,然后在删除后在触发点中添加上述条目 . 现在每当我删除一个条目从那里 .
第一:身份规范只需:“否”>>保存数据库执行项目
之后:身份规范只需:“是”>>保存数据库执行项目
您的数据库ID,PK从1 >>开始
使用此存储过程:
只是重温我的回答 . 我在sql server 2008 r2中遇到了一个你应该知道的奇怪行为 .
第一个选择产生
0, Item 1
.第二个产生
1, Item 1
. 如果在创建表后立即执行重置,则下一个值为0.老实说,我并不感到惊讶,微软无法正确使用这些东西 . 我发现它是因为我有一个脚本文件填充了我在重新创建表时有时会运行的引用表,有时候表已经创建了表 .这是一个常见的问题,答案总是一样的:不要这样做 . 身份值应被视为任意,因此,没有“正确”的顺序 .
虽然大多数答案都建议
RESEED
到0
,虽然有些人认为这是TRUNCATED
表的缺陷,但微软有一个排除ID
的解决方案 .这将检查表并重置为下一个
ID
. 从MS SQL 2005到现在,这已经可用 .https://msdn.microsoft.com/en-us/library/ms176057.aspx
Truncate
表是首选,因为它清除记录,重置计数器并回收dis空间 .仅当外键阻止您截断时,才应使用
Delete
和CheckIdent