重设IDENTITY值


16

我有一个带有IDENTITY列的表。在开发时,我会不时删除这些行,然后再次添加它们。但是,当我再次添加IDENTITY值时,它们始终保持增加,并且不是从1开始。现在我的ID是从68-> 92,这使我的代码崩溃。

如何重置IDENTITY值?


我将使我的代码对丢失的身份值更具弹性。标识列不能保证连续的编号,并且最终会发生
Trubs

Answers:


29

您可以通过以下方式重置身份值

DBCC CHECKIDENT('tableName', RESEED, 0)

因此,下次您插入TableName时,插入的标识值为1。

当您从表中删除行时,它不会重置身份值,但会不断增加它。就像您的情况一样。

现在,当您截断该表时,它将把Identity值重置为其表的原始Seed值。

请参考:SQL SERVER – DELETE,TRUNCATE和RESEED Identity,以获取详细的示例以及截断和删除之间区别的一些很好的解释。


22

Kin向您展示了如何重置IDENTITY值,但是在开发环境之外,当您真正要删除所有数据时,为什么需要这样做?

我希望您在生产时不打算保持IDENTITY值的连续序列。我希望您不是真的在编写代码来对IDENTITY值进行硬编码。如果这些是有意义的ID值,则应停止使用IDENTITY属性。

有一些事情可以阻止这种情况的发生:

  • 如果在交易期间分配了IDENTITY值,并且回滚了该交易,则该值不会“退还”,下一个值将是一个从未使用的值+ 1。
  • 如果以后删除一行,则IDENTITY将永远不会再填补空白。
  • SQL Server 2012中存在一个活动的错误,直到SQL Server 2014 永远不会被修正(除非您使用无证且非常昂贵的跟踪标志)后,该错误才会得到修复,由此重启似乎会丢弃IDENTITY列中的多达1000个值。Connect上的错误表明,这仅限于涉及可用性组的故障转移事件,但是我可以向您保证,该错误的影响范围远不止于此。

简而言之,如果您关心差距或希望给这些值指定特定含义,请停止使用IDENTITY。删除并重新创建表,然后在需要删除值并重新填充时,执行更新或对该列执行带有硬编码值的插入。

顺便说一句,主键和身份不是同一回事。除非您明确定义身份列,否则身份列不是主键,并且您当然可以拥有不是身份列的主键。


-4

如果只需要消除没有跟随标识字段增量值的最后几行,则有一种简单而安全的方法:

  1. 首先删除“跳转”的最后一条记录
  2. 更改身份字段的数据类型(从int更改为bigint,反之亦然)
  3. 保存表格
  4. 添加一个新记录,并检查它是否分配了最大值+1
  5. 替换身份字段的数据类型,以方便您的需要

到此为止。


3
对于SQL Server,“保存表”不是有意义的语句。少于100行的数据类型更改可能是微不足道的,但对于大型表可能会非常昂贵。
Michael Green

2
我认为您是指SSMS。这将创建一个新表,将所有行复制到表中,删除旧表并重命名新表。您需要执行两次以将数据类型切换回去。它使用大锤将螺母开裂。
马丁·史密斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.