【问题标题】:SQL Server IDENTITY skipping [duplicate]SQL Server IDENTITY跳过[重复]
【发布时间】:2013-04-18 09:32:09
【问题描述】:

我有一个使用 SQL Server 作为后端运行了大约 10 年的 .NET 应用程序。出于某种原因,在过去的 2-3 个月中,它决定跳过大约 990 个(我认为是 997 两次,989 一次)IDENTITY 号码 3 次。我想不出系统所做的任何活动会生成记录然后删除它们或尝试多次插入。这是一个非常间歇性的问题,但它很奇怪,我想深入了解它。有没有人对如何寻找原因有任何想法?

该系统混合了不同的技术——旧的东西是 ADO.NET,而新的东西是 Linq to SQL。我认为记录每个执行的语句或任何内容是不可行的,因为它是一个拥有大量用户的非常活跃的系统。

【问题讨论】:

  • 看到了,但我不担心这里和那里的奇怪跳过。我知道什么样的事情会导致身份被跳过,但我不认为任何应该正在运行并且它过去从未做过,所以我想知道如何跟踪关闭导致它的查询。
  • 可能没有导致它的查询。差距可能纯粹出于内部原因(例如,文档mentions 缓存是一个原因),所以没有什么可以“修复”的。您可以使用 SQL Profiler,但您的真正问题似乎是用户将无意义的数字视为有意义,因此您需要关注这个问题。或许您可以改进应用程序 GUI 以减少数据输入中的错误,或者他们确实需要一个顺序(或有意义的)ID,但从未明确要求过。
  • 我很难相信这类似于缓存问题 - 我无法相信它会缓存 1000 多个 ID,其规模相当于 10 年内生成了大约 30000 条记录的表,并且然后报废它们,除非缓存算法出现问题。问题不在于应用程序中的数据输入——当他们使用这些 ID 作为文档和电子邮件中的参考时,问题更多。他们没有理由必须依赖绝对顺序,但是在他们存在 10 年后,他们已经养成了这样思考的习惯

标签: sql-server identity


【解决方案1】:

这是正常的 - 如果由于违反约束而导致更新尝试失败(例如,因为尝试将 NULL 插入不可为空的列或不存在的外键),则标识字段将增加但行不会插入。

下一个插入的行(假设它不会失败)将增加标识并插入,留下一个“间隙”。

这不是问题。

【讨论】:

  • 我知道这一点,但用户确实使用身份字段作为参考,如果它按照他们期望的顺序编号跳过,这会让他们感到困惑。我也担心我不知道是什么试图以随机间隔进行如此多的插入,我想追踪它
  • @wizzardmr42 - 出于这个和其他原因,不建议公开这样的内部 ID。无论如何,有什么问题?好像他们不会在任何地方看到无效的 ID?您的应用程序应该考虑到这一点。
  • 我知道不公开内部 ID,但这是我在大约 3 或 4 年前接手的一个项目,对此没有优先考虑。问题是他们经常引用 ID,例如。在文档中,当突然跳过并错误输入例如 ID 时,他们更容易出错。 1000 出正确的一个
  • @wizzardmr42 - 错字就是错字。即使 Id 是连续的,这也是一个问题(它们将指向 错误 记录,而不是发现没有这样的记录)。
  • 呃,不-关键是如果他们处理的所有ID都是例如。在 42000 范围内,他们希望在达到 43000 范围之前进入 42900。如果他们突然从 42100 跳到 43097,那么他们很有可能会误读,例如。 43103 为 42103,因为他们不期待跳跃。我很确定他们在检查后面的数字时会更加小心,告诉他们要更加小心并不是我正在寻找的解决方案。
猜你喜欢
  • 2016-08-24
  • 1970-01-01
  • 2018-01-04
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多