什么会导致自动递增主键跳过数字?

Man*_*eld 6 sql-server entity-framework auto-increment identity sql-server-2012

我有一个使用以下 T-SQL 创建的表:

CREATE TABLE [dbo].[TableName](
    [id] [int] IDENTITY(1,1) NOT NULL
PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

我今天查看了这张表,注意到 id 列正在跳过值:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26、27、1027、1028、1029、1030、1031、1032、1033、1034、1035、2034、2035、3034

我不担心这个或任何事情(我的应用程序不关心主键是什么),我只是想知道可能导致这种情况发生的原因。似乎确实有一种模式,每次“跳跃”发生时跳跃 1000。

我的应用程序使用实体框架插入这些行,如果这有什么不同的话。

Aar*_*and 8

有很多事情会导致 IDENTITY 列中的空白(回滚、删除),但在这种情况下,由于跳转,我怀疑是这个错误 - 由引入 SEQUENCE 对 IDENTITY 的更改引起的:

所以我敢打赌,如果您查看 SQL Server 的错误日志,会在 SQL Server 服务重新启动、分离/重新附加数据库等后不久插入与这些跳转相关的行。

不过,真的,你为什么关心差距?你不应该。如果您需要连续的数字序列,请停止使用 IDENTITY。

  • @Mansfield 这不仅适合您,也适合其他读者……因为大多数注意到这一点、抱怨或搜索它的人,*做* 关心差距,*做* 期望 IDENTITY 提供神奇的序列。 (4认同)
  • 就像我说的,我**不**在乎这些差距。我只是好奇是什么导致了它们:) (3认同)
  • @Steve 您可以使用可序列化的事务使下一行 max(current id) + 1。但是您将如何防止出现间隙?永远不要让任何人删除任何东西? (2认同)