【问题标题】:Questions about increment operator关于增量运算符的问题
【发布时间】:2013-08-22 14:59:12
【问题描述】:

我有一个带有递增字段的表。该字段的值为1, 2, 3...60,然后该字段为1060

不知道为什么?

id 的下一个值必须是61

【问题讨论】:

标签: sql sql-server tsql sql-server-2012 identity-column


【解决方案1】:

这是 SQL Server 2012 的一项新功能。标识列使用Sequences,默认情况下将值兑现以加快插入新行的速度。当 SQL Server 意外关闭时,缓存会丢失,并且标识值会继续创建间隙(通常为 1000 或 10000)。

【讨论】:

    【解决方案2】:

    可能有多种原因 - 其中一些最有可能:

    • 999 条记录被删除
    • 已尝试 999 次插入但失败
    • 使用DBCC CHECKIDENT ({table}, RESEED, {value}); 重置标识值
    • 使用SET IDENTITY_INSERT ON 插入具有特定 ID 的记录

    自动增量字段保证连续。你保证是唯一的。如果你需要它们是连续的,那么我建议你自己跟踪下一个 ID,这需要你考虑并发、外键引用等。

    【讨论】:

      【解决方案3】:

      我假设您的意思是一个增量为 1 的 IDENTITY 字段。 每次插入新记录时,该值都会增加 1。

      引用:

      如果存在频繁删除的表的标识列,则间隙 可以发生在标识值之间。如果这是一个问题,请不要使用 IDENTITY 属性。但是,为了确保没有间隙 创建或填补现有空白,评估现有身份 使用 SET IDENTITY_INSERT ON 显式输入一个值之前的值。

      正如在 cmets 中提到的那样,该表很可能曾经填充了所有缺失值的数据,但这些已被删除。 (因为这是一个相当大的块,也许这是批量完成的?)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-23
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 2019-12-16
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多