2017-08-16 39 views
0

我想从mySQL Auto Increment生成Bill No。我有列ID(主键&自动递增)。现在从此列ID我正在生成帐单否按用户请求。问题是如果我删除了一些记录,那么当输入新记录时,它不应该跳过已删除的ID。MySQL自动增量跳过删除号码

例如1001,1002,1003,1004等在这个,如果我删除记录Id 1002 &下一次如果我输入任何新的记录,那么我怎么能指派1002回到新的记录。

+0

真的没有你想要做这件事情的情况 – Strawberry

回答

3

当新的记录被输入

是的,它应该把它不应该跳过删除ID。你只是依靠这个系统来做一些从未设计过,从未声称过的事情。

AUTOINCREMENT不适用于生成“帐单号”。它旨在通过永不重复使用值来生成不断增加的标识符并保证唯一性。它正是这样做的。

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

唯一性对标识符很重要。

+0

很好的解释。很多ppl不知道数据库为什么使用auto_increment以及这是多么重要。 – Noob

+0

是的,我同意自动增量仅用于唯一数据。我的意思是我不完全依靠ID来生成帐单号。我已经应用ID前缀逻辑来生成发票号。不过,我也希望将ID列值附加到我的账单号码中。在我们的行业,我们需要保留每一个数字的记录。如果任何数字在执行删除后跳过,我们会因此而受到处罚。如果不可能,你能建议我应该采用什么逻辑? – SUN

+0

@SUN:如果您的行业有自定义要求,那么您需要应用自定义逻辑来生成帐单编号。也许某种函数通过查看现有记录并找到第一个空数字?任何方法在性能方面都不尽如人意。我怀疑通过简单地不删除记录就能更好地满足行业要求。这可能是行业要求的实际意图。如果记录发生错误,请发出第二个更正记录。不要删除它们。 – David

1

从财务管理的角度来看,能够删除和重新使用发票号码会损害您的审计线索并使您面临风险。同样从数据库完整性的角度来看,不允许重用主键,因为它会导致意外的结果,例如其他表中的记录在连接中出现错误。数据库通过不允许重用主键来保护其参照完整性,事实上,正如@David在他的回复中所说的,主键上自动增量的一部分功能是保持密钥的唯一性

现在对于解决方案来说,从财务角度来看,发票永远不应该被删除,因此存在审计线索,不正确的发票应该通过信用票据进行反制。 '删除'记录并重新使用发票号码,我会建议为发票号码设置不同的字段,而不是实际删除,但是使用一个字段来标记活动或删除,并且保留一个单独的递增发票号码。将至少有助于维护您的记录的完整性