重置 IDENTITY 值

Gij*_*ijs 17 sql-server auto-increment alter-table identity ddl

我有一个带有 IDENTITY 列的表。在开发时,我不时删除行并再次添加它们。但是 IDENTITY 值总是不断增加并且当我再次添加它们时并没有从 1 开始。现在我的 id 从 68 -> 92 开始,这会导致我的代码崩溃。

如何重置 IDENTITY 值?

Kin*_*hah 31

您可以通过以下方式重置标识值

DBCC CHECKIDENT('tableName', RESEED, 0)
Run Code Online (Sandbox Code Playgroud)

所以下次插入 TableName 时,插入的标识值将为 1。

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

现在,当您截断表时,它会将 Identity 值重置为其原始表的种子值。

请参阅:SQL SERVER – DELETE、TRUNCATE 和 RESEED Identity以获取详细示例以及对Truncate 和 Delete 之间差异的一些很好的解释


Aar*_*and 22

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

我希望您在生产时不打算维护连续的 IDENTITY 值序列。我希望您不是真的编写代码来硬编码 IDENTITY 值。如果这些是有意义的 ID 值,那么您应该停止使用 IDENTITY 属性。

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

  • 如果在事务期间分配了 IDENTITY 值,并且事务被回滚,则该值不会“返还”,下一个值将是从未使用过的值 + 1。
  • 如果稍后删除一行,则 IDENTITY 永远不会回来填补空白。
  • SQL Server 2012 中存在一个活动错误,直到 SQL Server 2014 永远不会修复(除非您使用未记录且非常昂贵的跟踪标志)才能修复该错误,因此重新启动似乎会丢弃 IDENTITY 列中的多达 1000 个值. Connect 上的错误表明这仅限于涉及可用性组的故障转移事件,但我可以向您保证该错误比这更广泛。

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

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