2017-03-06 44 views
0

我在postgres中有一个数据库表,用于为公司生成收据编号。该表有一个名为receipt_number的列,当列在post后记录时插入,所有的i do是检查最后一个receipt_number并将其增加1以获得下一个收据编号,问题是,当假设两个客户同时支付时,有两行记录,但它们具有相同的收据编号,否则一切都很好。如何控制postgres数据库表中的重复条目

的......这个是什么原因碰巧只有当多个客户端使在同一时间支付任何想法..

在此先感谢

+0

表中没有主键 –

+0

如何检查“最后一个receipt_number”?如果这是一个简单的'max()',那么永远不会工作。你能忍受数字中的差距吗?然后使用一个序列。 –

+0

我有我以前使用过的PK,但突然间它开始跳转数字不是按顺序排列,因此我决定引入一个单独的列。并且您正确使用了max(),它给了我同样的问题。我有一个单独的表,我在收据表中插入一条新记录之前调用current_receipt_number,然后将其增加1,然后将其更新为当前数字,以备下一条目使用 – user6781731

回答

0

正是由于并发访问。当事件同时发生两次时,两个实例在保存另一个事件之前获得最大值,因此最大值是相同的。一个可能的解决方案是使列serial。如果这不是一个选项,那么你可以在服务器端拥有一个事件队列,并且无论你打算添加新记录而不是插入它,都可以将它们添加到队列中。另一方面,cron作业或心跳作业可以定期检查队列,如果队列不是空的,则按顺序执行命令。

+0

从您的评论中,是否可以将我的列更改为串行,因为我试图检查,似乎我不能改变现有的列SERIAL ... – user6781731

+0

@ user6781731这是因为你有重复的数据。关于改变,看到这里http://stackoverflow.com/questions/27307835/how-to-convert-primary-key-from-integer-to-serial –

+0

@ user6781731你也可能有空白。我相信你应该停止在线应用程序,创建一个临时表,在这里你有一个串行版本的列,然后复制所有记录,删除主表,用正确的结构重新创建它,将数据从临时表中迁移回来,删除临时表并重新启动您的应用程序。 –