繁体   English   中英

IDENTITY不生成种子并正确递增

[英]IDENTITY not generating the seed and increment correctly

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

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

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

  • INSERT失败
  • 回滚的事务
  • 这个bug
  • 随后的DELETE(也可能破坏你自己的解决方案)
  • 等等

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

请参阅Microsoft对此“Bug”报告的响应: Identity Column按种子值跳转

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

感谢您的反馈意见。 这种行为实际上是设计的,因为我们试图保证ID的唯一性,而不是确保我们没有差距。 因此,我们会在某些情况下跳过某些值,以便我们在偶然重复数字时没有任何问题。

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

DBCC CHECKIDENT('Customer', RESEED, 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值重新设置为下一个最高可用标识值。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM