2017-03-06 42 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你也可能有空白。我相信你應該停止在線應用程序,創建一個臨時表,在這裏你有一個串行版本的列,然後複製所有記錄,刪除主表,用正確的結構重新創建它,將數據從臨時表中遷移回來,刪除臨時表並重新啓動您的應用程序。 –