IDENTITY不生成种子并正确递增

时间:2013-11-22 19:49:16

标签: sql sql-server

我将列ID设置为IDENTITY with seed且increment = 1,1。但是,它不会从1开始计数。而是从2开始。当我插入下一行时,它设置ID = 7而不是2.为什么会发生这种情况,我该如何解决?

我编写了表格并检查了管理工作室。它实际上是一个IDENTITY(1,1)。

5 个答案:

答案 0 :(得分:7)

IDENTITY不保证一组没有间隙的连续值。如果这是您所需要的,您应该考虑其他事项(例如,滚动您自己的可序列化MAX+1解决方案)。各种各样的事情都可能造成差距:

  • INSERT失败
  • 已回滚的交易
  • this bug
  • 后续的DELETE(也可能破坏你自己的解决方案)
  • 等。等

答案 1 :(得分:4)

这是设计。 IDENTITY列没有连续保证的保证。

请参阅 Microsoft 对此“错误”报告的回复:Identity Column jumps by Seed value

  

Microsoft于2013年1月25日下午3:38发布

     

感谢您的反馈。这种行为实际上是我们设计的   尽量保证ID的唯一性,而不是确保我们不这样做   有差距。因此,我们确实跳过了一些值,以防万一   方案,以便我们不会意外地遇到任何问题   重复数字。

答案 2 :(得分:0)

即使表是空的,SQL服务器也会记住它使用的最后一个标识。如果您想将其重置为1,请尝试以下操作:

DBCC CHECKIDENT('Customer', RESEED, 0)

答案 3 :(得分:0)

CREATE TABLE Id_Table (
        [Id] int IDENTITY(1,1), Value INT);
GO

INSERT INTO Id_Table (Value)
VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
GO

DELETE FROM Id_Table
WHERE ID = 1 OR  ID = 3 OR ID = 5 OR ID >7
GO

SELECT * FROM Id_Table

DBCC CHECKIDENT('Id_Table', RESEED, 0)  --<-- Reseed to any smallest number
DBCC CHECKIDENT('Id_Table', RESEED)     --<-- Reseed without providing any seed value

SQL SERVER消息

Checking identity information: current identity value '10', current column value '0'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
Checking identity information: current identity value '0', current column value '7'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

将表重新设置为Zero,然后只执行不带任何种子值的DBCC命令,它会将Identity值重新设置为下一个最高可用标识值。

答案 4 :(得分:0)

实际上解决这个问题非常简单。我使用的是Visual Studio 2013设计器,SQL Server对象资源管理器。在“设计视图”中打开违规表,选择“识别”字段并拉出属性。我只更新了Identity Seed和Increment值,然后单击Update按钮。这为我修好了。

虽然不保证身份增量,但我们已经预计到目前为止输入的最高增量应该加1。