SQL Server:标识列采用随机范围

SQL Server:标识列采用随机范围,sql,sql-server,identity-column,Sql,Sql Server,Identity Column,在处理SQL Server数据库时,我发现在SQL Server 2012企业版中,标识列的值突然跳到101 数据库中总共有10条ID为(1到10)的记录。没有执行删除操作,在插入记录编号11时,it工具101 我在浏览了一些在线帮助后发现了原因: ,及 发生这种情况还有其他原因吗?设计上是可能的。身份不能保证是连续的或单调的。没有人能帮忙,因为不需要任何帮助。应用程序不应依赖于没有间隙的标识。具有标识值行1、2、100、1000总是可以的 这怎么可能?首先,考虑一下删除> /代码>的小事。显然

在处理SQL Server数据库时,我发现在SQL Server 2012企业版中,标识列的值突然跳到101

数据库中总共有10条ID为(1到10)的记录。没有执行删除操作,在插入记录编号11时,it工具101

我在浏览了一些在线帮助后发现了原因:

,及


发生这种情况还有其他原因吗?

设计上是可能的。身份不能保证是连续的或单调的。没有人能帮忙,因为不需要任何帮助。应用程序不应依赖于没有间隙的标识。具有标识值行1、2、100、1000总是可以的

这怎么可能?首先,考虑一下<代码>删除> /代码>的小事。显然,删除行会留下间隙

一个更微妙的问题是,即使没有删除,身份之间也会出现差距。发生这种情况是因为存在删除,而您只是不知道它们。它们是由未提交的事务回滚引起的。无法阻止回滚,因为禁止回滚类似于说“这将永远成功!”,即忽视现实(失败)。在插入过程中断开客户端连接是一种回滚,您永远无法防止这种情况发生

总是期待差距。代码期望有间隙。永远不要依赖于身份是连续的

我必须用顺序来解决这个问题


序列具有完全相同的问题。这不是设计上的一些疏忽,这是一个基本问题:没有性能好的方法来生成连续的、无间隙的ID。唯一的解决方案是序列化所有输入(例如表X锁),没有人愿意这样做。

设计上是可行的。身份不能保证是连续的或单调的。没有人能帮忙,因为不需要任何帮助。应用程序不应依赖于没有间隙的标识。具有标识值行1、2、100、1000总是可以的

这怎么可能?首先,考虑一下<代码>删除> /代码>的小事。显然,删除行会留下间隙

一个更微妙的问题是,即使没有删除,身份之间也会出现差距。发生这种情况是因为存在删除,而您只是不知道它们。它们是由未提交的事务回滚引起的。无法阻止回滚,因为禁止回滚类似于说“这将永远成功!”,即忽视现实(失败)。在插入过程中断开客户端连接是一种回滚,您永远无法防止这种情况发生

总是期待差距。代码期望有间隙。永远不要依赖于身份是连续的

我必须用顺序来解决这个问题


序列具有完全相同的问题。这不是设计上的一些疏忽,这是一个基本问题:没有性能好的方法来生成连续的、无间隙的ID。唯一的解决方案是序列化所有输入(例如表X锁),没有人愿意这样做。

搜索
SQL Server 2012身份跳转
应该会找到大量其他问题/答案。但和往常一样,我建议您:如果标识列的实际数值对您来说很重要,那么您就做错了。它们应该被视为不透明的斑点,恰好可以放在数字列中。你的雇主同意在屏幕截图中发布你项目的所有信息吗?我可以看到该项目所针对的公司,数据库模式,ID…使用SQL Server 2012中的序列?感谢您提供反馈。我必须使用sequence来解决这个问题。搜索
SQLServer2012身份跳转
应该会找到很多其他问题/答案。但和往常一样,我建议您:如果标识列的实际数值对您来说很重要,那么您就做错了。它们应该被视为不透明的斑点,恰好可以放在数字列中。你的雇主同意在屏幕截图中发布你项目的所有信息吗?我可以看到该项目所针对的公司,数据库模式,ID…使用SQL Server 2012中的序列?感谢您提供反馈。我必须使用序列来解决这个问题。换句话说,如果你依赖于ID是一个好的值,那么不要使用identity-只要自己管理ID,你自己的方式。@Luaan:那么在存在删除和回滚的情况下,你到底如何管理ID使其“好”呢?这是一个。哦,是的,完全是。我更喜欢这样的场景,OP似乎有某种问题类型,这可能在代码中的某个地方被引用。如果它是在代码中引用的(而不是以动态的、模块化的方式),那么最好只是有一个静态ID,而不是允许创建新的ID。因此,至少是一个不同的问题类型表,它实际上说明了问题类型是什么(以及应该做什么),而不是每个MarketplaceID都有一个问题类型表。此表将不可由用户编辑,并绑定到代码。换句话说,如果您认为ID是一个好的值,则不要使用标识-只需自行管理ID即可。@Luaan:在存在删除和回滚的情况下,您将如何准确地将ID管理为“好的”?这是一个。哦,是的,完全是。我更喜欢这样的场景,OP似乎有某种问题类型,这可能在代码中的某个地方被引用。如果它是在代码中引用的(而不是以动态的、模块化的方式),那么最好只是有一个静态ID,而不是允许创建新的ID。因此,至少是一个不同的问题类型表,它实际上说明了问题类型是什么(以及应该做什么),而不是每个MarketplaceID都有一个问题类型表。此表不可由用户编辑,并绑定到代码。