【问题标题】:MySQL Auto increment skipping number which is deleted [duplicate]MySQL自动增量跳过被删除的数字[重复]
【发布时间】:2018-01-24 12:06:12
【问题描述】:

我想从 mySQL 自动增量生成 Bill No。我有列 ID(主键和自动增量)。现在,根据用户的要求,我正在从这个列 ID 生成账单号。问题是如果我在两者之间删除了一些记录,那么当输入新记录时它不应该跳过已删除的 ID。

例如1001,1002,1003,1004 等如果我删除记录 ID 1002 和下次如果我输入任何新记录,那么如何将 1002 分配回新记录。

【问题讨论】:

  • 在任何情况下你都不想这样做

标签: mysql


【解决方案1】:

输入新记录时不应跳过已删除的ID

是的,应该。你只是在依赖系统做一些它从未设计过也从未声称要做的事情。

AUTOINCREMENT 并非旨在生成您的“Bill No”。它旨在生成一个不断增加的标识符,并通过从不重复使用一个值来保证唯一性。它正是这样做的。

您可以使用您喜欢的任何逻辑手动生成“Bill No”并将其存储在另一列中。不过,重用值会很奇怪。想象一下,如果您向某人发出账单,然后删除记录,然后再向具有相同号码的其他人发出另一张账单。

唯一性对于标识符很重要。

【讨论】:

  • 很好的解释。很多人不知道数据库为什么使用 auto_increment 以及它的重要性。
  • 是的,我同意自动增量仅用于唯一数据。我的意思是我不完全依赖 ID 来生成账单号。我已经应用 id 前缀逻辑来生成发票编号。但是,我还想在我的帐单编号中附加 ID 列值。在我们的行业中,我们需要记录每一个数字。如果任何数字在执行删除后跳过,那么我们会因此受到惩罚。如果不可能的话,你能建议我应用什么逻辑吗?
  • @SUN:如果您的行业有自定义要求,那么您需要应用自定义逻辑来生成您的账单编号。也许某种功能可以查看现有记录并找到第一个空数字?就性能而言,任何方法都不太理想。我怀疑不删除记录可以更好地满足行业要求。这可能是行业要求的实际意图。如果一个记录发出错误,发出第二个更正它。不要删除它们。
  • 我知道我在回答中追求这一行而被否决,但从财务审计跟踪的角度来看,删除错误提出的发票是一个坏主意。正如@David 在他的评论中所说,最好先提出信用额度,然后重新开具发票。这样,您的记录就无缝了。
【解决方案2】:

从财务控制的角度来看,能够删除和重复使用发票编号会损害您的审计跟踪并让您面临风险。同样从数据库完整性的角度来看,不允许重用主键,因为它会导致意外结果,例如其他表中的记录在连接中出现错误。自然化主键会产生后果(excellent discussion of natural and surrogate primary keys)。数据库通过不允许重用主键来保护其引用完整性。事实上,正如@David 在他的回复中所说,主键自动增量功能的一部分就是保持key的唯一性。

现在到了解决方案,从财务方面来说,发票永远不应该被删除,因此会有审计跟踪,不正确的发票应该通过贷方通知单进行对比。在数据库方面,如果您必须“删除”一条记录并重新使用发票编号,我建议为发票编号设置一个不同的字段,而不是实际删除,而是使用一个字段来标记活动或已删除,并维护一个单独的递增发票数字。尽管不建议这样做,但这至少有助于维护您的记录的完整性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2011-01-13
    相关资源
    最近更新 更多