在我的应用中,我有用户和发票(除其他外)。
我不确定确保每个用户的发票以1开头并递增的最佳方法是什么。例如:
我显然不能使用默认的id列,因为它只会在每个条目上增加一。我考虑过的解决方案是在发票表中有一个新列,称为“ incrementalId”,当保存发票并将其设置为比最大数量大1时,我会手动对其进行更新。
这是解决此问题的标准方法吗?我能想到的一个问题是,如果我删除一张发票,那么我生成的下一张发票很可能已经具有一个ID。还是删除发票时删除条目不是真正的方法?
答案 0 :(得分:1)
您想要实现的是SQL中的无缝序列。 您不能依赖自动生成的ID,因为如果回滚事务会出现空白(ID值将永远丢失,将其取回是...您不希望看到的东西)。
有不同的实现方法,这取决于您的要求以及性能是否很重要。
首选,您不会在创建时填写发票编号。您只需每x秒,分钟或小时运行一次批处理,以获取没有编号的发票,从数据库中获取最高的发票编号,然后将所有这些编号列填写在一个事务中。该批处理应该是唯一的参与者,以便在没有其他并发执行的情况下填充发票编号列(请注意,该批处理是否仍在运行以不产生另一个)。一口气填满所有空发票编号时,它的性能非常好,也不需要将读数锁定在桌上,但这不是实时的。
第二选择,实时解决方案。为此,您将必须使用计数器表,它肯定会涉及一些plsql或类似的表,因为您的数据库是唯一知道发票序列号确切状态的计数器(数据库中可能会创建多个发票,因此数据库是决定此顺序的唯一仲裁者)。这将意味着锁定行,因此,如果您增加许多发票,则每次插入都会使整个过程变慢,但是您将尽快获得发票编号。以将某些工作委派给数据库为代价。
检查以下解决方案是否适用于Postgresql,例如:PostgreSQL gapless sequences