我想从mySQL Auto Increment生成Bill No。我有列ID(主键和自动增量)。现在来自此列ID我正在生成用户请求的帐单号。问题是如果我删除了一些记录,那么在输入新记录时不应该跳过已删除的ID。
e.g。 1001,1002,1003,1004等在此,如果我删除记录Id 1002&下次如果我输入任何新记录,那么如何将1002分配回新记录。
答案 0 :(得分:3)
输入新记录时不应跳过已删除的ID
是的,应该。你只是依靠系统来做一些从未设计过的事情,从未声称要这样做。
AUTOINCREMENT
并非旨在生成您的“Bill No”。它旨在生成不断增加的标识符,并通过永不重用值来保证唯一性。它正是这样做的。
您可以使用您喜欢的任何逻辑手动生成“Bill No”,并将其存储在另一列中。但重新使用值会很奇怪。想象一下,如果您向某人发出帐单,稍后删除该记录,然后向具有相同号码的其他人发出另一张帐单。
标识符的唯一性很重要。
答案 1 :(得分:1)
从财务控制的角度来看,能够删除和重复使用发票号码会损害您的审计线索,让您面临风险。同样从数据库完整性的角度来看,不允许重用主键,因为它会导致意外的结果,例如其他表中的记录在连接中出现错误。自然化主键(excellent discussion of natural and surrogate primary keys)会产生影响。数据库通过不允许重用主键来保护其参照完整性。事实上,正如@David在他的回答中所说,自动增量的一部分功能是主键是保持密钥的唯一性。
现在要解决方案,从财务方面来说,永远不应该删除发票,因此存在审计跟踪,不正确的发票应该通过信用票据进行对比。在数据库方面,如果您必须“删除”记录并重复使用发票编号,我建议为发票编号设置不同的字段,而不是实际删除,而是使用字段标记活动或删除,并维护单独的递增发票数。虽然不建议,但这至少有助于保持记录的完整性。