为什么我的IDENTITY列值存在差距?

use*_*475 12 sql sql-server

我有个问题.

我的ID主要(IDENTITY)配置为自动递增(类型:int).但是,当我插入一个新行时,这个新的id不是连续的.怎么了?有解决方案吗

编辑:

[...]
[id]int] IDENTITY(1,1) NOT NULL,
[...]
CONTRAINT [PK_Medida] 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]
Run Code Online (Sandbox Code Playgroud)

Kap*_*wal 17

列上的标识属性不保证以下内容:

值的唯一性 - 必须使用PRIMARY KEY或UNIQUE约束或UNIQUE索引强制实现唯一性.

事务中的连续值 - 插入多行的事务不能保证获得行的连续值,因为表上可能会出现其他并发插入.如果值必须是连续的,则事务应使用表上的独占锁或使用SERIALIZABLE隔离级别.

服务器重新启动或其他故障后的连续值 -出于性能原因,SQL Server可能会缓存标识值,并且在数据库故障或服务器重新启动期间,某些分配的值可能会丢失.这可能导致插入时身份值的缺口.如果间隙不可接受,则应用程序应使用带有NOCACHE选项的序列生成器,或使用自己的机制生成键值.

重用值 - 对于具有特定种子/增量的给定标识属性,引擎不会重用标识值.如果特定的insert语句失败或者回滚insert语句,则消耗的标识值将丢失,并且不会再次生成.当生成后续标识值时,这可能导致间隙.

也,

如果存在频繁删除的表的标识列,则标识值之间可能会出现间隙.如果这是一个问题,请不要使用IDENTITY属性.但是,要确保没有创建间隙或填充现有间隙,请在显式输入之前评估现有标识值SET IDENTITY_INSERT ON.

此外,检查标识列属性并检查标识增量值.它应该是1.

在此输入图像描述

  • +1,但我个人看到重用(导致主键违规).我从来没有手动插入一行.我从来没有删过一行.所有插入都由事务中的一个进程完成(尽管该进程有时在中间被杀死).它突然停止工作,叹了口气. (2认同)

Rem*_*anu 16

不要指望身份是连续的.有许多情况可以留下空白.将身份视为抽象数字,并且不附加任何商业意义.

  • 在MySQL中,它也可以留下空白.主要原因是刀片的回滚,它们会造成间隙.直接插入/提交/插入/提交将创建没有间隙的密集ID系列.但总是会出现差距.如果你有太多的空白担心4字节有符号int地址空间的ID耗尽,那么你必须在代码中做错事来留下这些空白.最后,如果你真的担心,可以使用`bigint`而不是`int`. (7认同)
  • 这是正确的,但我希望我的桌子会很长,而且我担心将来的id会超出范围. (2认同)