SQL增量很少不正确

SQL增量很少不正确,sql,Sql,我正在尝试维护一个票务系统,以跟踪工作单编号,并每隔一段时间记录工单编号。WO_NUM应与WOID相同。但由于某种原因,在使用该系统多年后,WO_NUM开始比WOID大1 然后几个月后(128天),准确地说,这一次它再次跳到比世界纪录大2倍 这种情况在18天后再次发生,但这一次比WOID大3,WOU NUM从241283跳到241285,而WOID通常从241281增加到241822 7天后,WO_NUM从241897跳到241899,而WOID通常从241894增加到241895 这似乎越

我正在尝试维护一个票务系统,以跟踪工作单编号,并每隔一段时间记录工单编号。WO_NUM应与WOID相同。但由于某种原因,在使用该系统多年后,WO_NUM开始比WOID大1

然后几个月后(128天),准确地说,这一次它再次跳到比世界纪录大2倍

这种情况在18天后再次发生,但这一次比WOID大3,WOU NUM从241283跳到241285,而WOID通常从241281增加到241822

7天后,WO_NUM从241897跳到241899,而WOID通常从241894增加到241895


这似乎越来越远,而且几乎以指数级的速度发生。你知道为什么会这样吗?我该如何解决它?

如果你在SQL Server中使用
标识
字段,或者在另一个系统中使用类似的自动递增机制,则不能保证你的ID是连续的。如果尝试插入新行但插入失败,则会跳过本应使用的ID。这是为了允许另一个插入在另一个插入过程中开始,而不会发生ID冲突

如果您需要(不希望)ID是连续的,则必须执行以下操作:

  • 创建一个锁定机制,以便插入是原子的
  • 使用将存储表的下一个可用ID的键表
  • 仅当插入成功时才递增键表

这就是说,很明显,这会给您的系统增加很多风险,并且无法解决删除记录时会发生的问题。我将重新考虑您是否需要连续的ID,以及该功能是否值得额外的开发和开销。

如果您在SQL Server中使用
标识
字段或在其他系统中使用类似的自动递增机制,则无法保证您的ID是连续的。如果尝试插入新行但插入失败,则会跳过本应使用的ID。这是为了允许另一个插入在另一个插入过程中开始,而不会发生ID冲突

如果您需要(不希望)ID是连续的,则必须执行以下操作:

  • 创建一个锁定机制,以便插入是原子的
  • 使用将存储表的下一个可用ID的键表
  • 仅当插入成功时才递增键表

这就是说,很明显,这会给您的系统增加很多风险,并且无法解决删除记录时会发生的问题。我会重新考虑您是否需要连续ID,以及该功能是否值得额外的开发和开销。

我自己解决了这个问题。结果表明,如果工单启动后取消而未保存,则工单数量将递增,而不会回滚。多亏了大家的帮助,很抱歉我没有提供必要的信息。下次我一定会做得更好

我自己解决了。结果表明,如果工单启动后取消而未保存,则工单数量将递增,而不会回滚。多亏了大家的帮助,很抱歉我没有提供必要的信息。下次我一定会做得更好

您完全没有告诉我们如何生成WO_NUM和WO_ID的信息,甚至没有告诉我们您使用的是什么RDBMS。请发布用于使用自动增量字段构建表的代码。抱歉,第一次这样做。我使用的是SQL Server Enterprise Manager,WO_NUM和WO_ID是每次创建新票证时递增的整数。出于某种原因,在某个过程中,WO_NUM似乎随机递增1、2、3等。我需要它们在我的报告中保持同步。您完全没有告诉我们WO_NUM和WO_ID是如何生成的,甚至没有告诉我们您使用的是什么RDBMS。发布用于使用自动递增字段构建表的代码。抱歉,第一次海报就这样。我在SQL Server Enterprise Manager上,WO NUM和WO_UID是每次创建新票证时递增的Int。出于某种原因,在这一过程中的某个地方,wou_NUM似乎随机递增1、2、3等等,我需要它们保持同步,以便我的报告谢谢。我曾与许多客户打过交道,他们痴迷于拥有完美的顺序ID。它们是唯一的标识符,仅此而已——除此之外,它们应该没有固有的含义。我知道它不需要是连续的,但我确实需要WOID和WOU NUM同步,以便我的报告WOU NUM增量为4,WOID增量为1,我更想知道如何解决这个问题。Not@PradyManepalli然后,您需要显示WO_NUM是如何确定的。但是,拥有一个与另一列值完全相同的列有什么意义呢?@DStanley如果我没有提供更多帮助,我很抱歉,这是我第一次使用这个列,这是我的经理让我修复的遗留系统。这是我发现的确定下一个WO_NUM的过程。
CREATE PROC bosi_getNextAvailWONum@inWO_NUM INT,@outWO_NUM INT输出为DECLARE@c INT SELECT@c=COUNT(WO_NUM),其中WO_NUM=@inWO_NUM如果@c<1 BEGIN SET@outWO_NUM=@inWO_NUM END,则从TASKS SET@outWO_NUM=(@c+1)结束返回(0)GO
谢谢。我与许多客户打过交道,他们痴迷于拥有完美的顺序ID。他们是唯一的标识符,仅此而已——除此之外,他们应该没有固有的意义。我知道这不需要是顺序的,但我确实需要将WOID和WOU NUM同步,以便我的报告WOU NUM增量为4和WOID的增量为1,我更想知道如何解决这个问题。Not@PradyManepalli然后你需要展示WO_NUM是如何确定的。但是有一列的值与另一列的值完全相同有什么意义呢?@DStanley如果我没有,我很抱歉