在我的一个表中,SQL Server 2012数据库标识增量的"ReceiptNo"列中的Fee突然开始跳到Fee,而不是1,这取决于以下两件事.

  1. 如果是1205446,则跳至1206306;如果是1206321,则跳至1207306;如果是1207314,则跳至1208306.我想让你们注意的是,最后三位数字保持不变,即306,每当 skip 发生时,如下图所示.

  2. 重新启动计算机时会出现此问题

在此处输入图像描述

推荐答案

由于自SQL Server 2012以来的性能改进,您会遇到这种行为.

现在,当为int列分配IDENTITY个值时,它默认使用IDENTITY0的缓存大小,重新启动服务可能会"丢失"未使用的值(bigint/numeric的缓存大小为IDENTITY00).

这在the documentation篇文章中提到过

SQL Server可能会出于性能原因和

从您显示的数据来看,这似乎发生在12月22日的数据输入之后,然后在重新启动SQL Server时保留了1206306 - 1207305的值.在12月24日至25日的数据输入完成后,再次重启,SQL Server保留了28日条目中可见的下一个范围1207306 - 1208305.

除非以异常的频率重新启动服务,否则任何"丢失"的值都不太可能在数据类型允许的值范围内产生任何重大影响,因此最好的策略是不要担心它.

如果这对你来说是一个真正的问题,一些可能的解决方法是...

  1. 例如,可以使用SEQUENCE而不是标识列,并定义较小的缓存大小,在默认列中使用NEXT VALUE FOR.
  2. 或者应用跟踪标志272,使IDENTITY个分配作为2008 R2之前的版本记录.这在全局适用于所有数据库.
  3. 或者,对于最新版本,执行ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF以禁用特定数据库的身份缓存.

You should be aware none of these workarounds assure no gaps. This has never been guaranteed by 100 as it would only be possible by serializing inserts to the table. If you need a gapless column you will need to use a different solution than either 100 or 102

Sql相关问答推荐

如何在数组2中获取数组1的计数值

LAG函数通过丢弃空值返回前一行

如何在幂函数中正确使用Power()和Exp()

在Postgres中实现合并功能的干净方法,因为当目标/源不匹配时

Lag()函数的差异:R与SQL(将R代码转换为SQL)

从日期开始向前填充重复项

返回UPSERT中的旧行值

SQL计数条目大于日期,包括交叉表中的零

如何设计一个调用嵌套函数并仅在所有被调用的嵌套函数都提交时才提交的事务,例如,如果一个子函数失败则中止?

PATINDEX中与[A-Z]匹配(U除外)的正则表达式

Postgres jsonpath运算符的变量替换,如_regex?

根据要过滤的列的值进行联接和分组

如何从三个连接表中获取数据,并始终显示第一个表中的数据,以及第三个表中的空值或现有记录?

计算 ID 满足条件的次数

SQL Server - 复杂场景 - 比较状态并填充值到后续行

如何在TSQL中编写此窗口查询

获取记录的上一个值,并将其与当前值一起显示

如何将输出转换为二维格式?

基于 Snowflake 的最大值创建新列

如何对 SQL 表中的连续时间戳进行分组?