sql server中的标识列值突然跳到1001

sql server中的标识列值突然跳到1001,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我正在使用Sql server 2012(Denali)。我想知道为什么所有标识列的值都从1001开始,以此类推。在开始时,Identity列从1、2开始,以此类推,并顺利添加Identity,但突然间,对于包含Identity列的数据库中的所有表,它跳到10011002并继续。原因可能是什么?请协助。我相信您对此连接项目的评论中有解释 为了提高高端机器的性能,我们引入 2012年标识值的预分配。这个特性可以是 使用TF 272禁用(然后您将从 2008R2) 标识属性单独存储在元数据中。如果一

我正在使用Sql server 2012(Denali)。我想知道为什么所有标识列的值都从1001开始,以此类推。在开始时,
Identity
列从1、2开始,以此类推,并顺利添加Identity,但突然间,对于包含Identity列的数据库中的所有表,它跳到10011002并继续。原因可能是什么?请协助。

我相信您对此连接项目的评论中有解释

为了提高高端机器的性能,我们引入 2012年标识值的预分配。这个特性可以是 使用TF 272禁用(然后您将从 2008R2)

标识属性单独存储在元数据中。如果一个值 在标识中使用,并调用增量,然后调用新的种子值 将被设置。无操作,包括回滚、故障切换等。。。。。可以 更改种子值(DBCC重新设定种子除外)。故障转移适用于 表对象,但没有标识对象。因此,对于故障转移,您可以 在手动故障切换之前调用检查点,但您可能会看到 计划外病例。如果差距是一个问题,那么我建议你使用TF 272

对于control manager关机,我们有一个下一个verion的修复程序(使用 另一个TF)。此修复程序将解决大多数control manager关闭问题 案例


我想你可以用序列来代替,序列给你100%的完全控制,而且在很多方面比身份更优越。。。 身份是如此的简单和方便

据我所知,当您使用identity执行插入操作失败时,无论如何都会使用identity进行验证

使用序列,您可以使用循环“填充”间隙。 尽管如此,正如Amy Barrett所指出的,这是在事务范围之外创建的


当您使用缓存时,有一种性能优化可能也很有用。

Microsoft已更改了它们在SQL Server 2012中处理标识值的方式,因此,在重新启动SQL Server实例或服务器计算机后,您可以看到记录之间的标识差异。此id缺口可能还有其他原因,这可能是由于安装更新后自动重新启动服务器造成的

您可以使用以下两种选择

  • 使用跟踪标志272 o这将导致为每个生成的标识值生成日志记录。打开此跟踪标志可能会影响标识生成的性能


  • 使用无缓存设置的序列生成器

    正在SQL Server 2012上设置此处所需的跟踪标志272

  • 打开“SQL Server配置管理器”

  • 单击左侧窗格中的“SQL Server服务”

  • 右键单击右侧窗格中的SQL Server实例名称->默认值:SQL Server(MSSQLSERVER)

  • 单击“属性”

  • 单击“启动参数”

  • 在“指定启动参数”文本框类型“-T272”上

  • 单击“添加”

  • 确认更改


如果您关心分配给标识列的数值,那么您就做错了。您应该将标识值视为不透明的blob,恰好可以存储在
int
(或其他数字类型)列中。所有这些的数据类型都是
int
,如何避免这种情况situation@eraj启用TF272,如同一连接项的注释中所述。@eraj-正如我在对您的问题的注释中所说,如果你关心数值,那么你使用的是
标识
错误。@Damien_不信者:不,10多年前编写系统的人错了。。。我没有时间机器,我有轻微的强迫症,所以把主键从6跳到1001可能会让我很沮丧,因为需要一个好的解释。下面是微软在“连接”上回复这个id危机问题的帖子中的一段话:如果您需要与以前版本的SQL Server相同的标识生成语义,则有两个选项可用:使用跟踪标志272=>这将导致为每个生成的标识值生成日志记录。打开此跟踪标志可能会影响标识生成的性能。请使用带有缓存设置()=>这将导致为每个生成的序列值生成日志记录。请注意,不使用缓存可能会影响序列值生成的性能。Microsoft页面(链接在您的答案中)指出,这只是为了防止其他人阅读此内容“序列号在当前事务范围之外生成。无论使用序列号的事务是提交还是回滚,它们都会被使用。”在一般说明下,我假设无论插入成功/失败与否,都会使用序列号。