2012-12-11 59 views
1

我的PostgreSQL 9.2數據庫出於某種原因跳過每個記錄的ID。例如:PostgreSQL總是創建一個具有偶數ID的記錄?

用戶

1258930 
1258932 
1258934 
1258936 

什麼會導致此?任何指向正確的方向來解決這個問題是值得讚賞的。謝謝

+8

我敢打賭,你要麼回滾插入某處(一致),要麼爲每個插入調用'nextval()'兩次。 –

+1

查看數據庫表設置,該列可以設置爲自動遞增2。 –

+1

您可以爲正在使用的序列提供「CREATE SEQUENCE ...」嗎? –

回答

1

的意見已經充分覆蓋可能的原因:

  • 多個nextval電話,說一個由default和一個明確的;
  • 由多個表中所使用的相同的序列
  • 交易被回滾

在正確的方向上沒有任何指針來解決這個問題認識

您的主要錯誤是查看這作爲問題。間隙出現在生成的序列中是完全正常的。如果您的數據庫崩潰並重新啓動,則會出現一個間隔。如果事務在分配ID後回滾,則會在順序中出現間隙。

您的應用程序必須能夠處理此。它不應該關心一個ID是什麼,只是它是唯一的。

有關詳細信息和提示,如果您需要真正的無間隙序列,請參閱this answer

0

加入Craig's points我認爲你會發現的一個罪魁禍首是DO ALSOrule將new.id插入到另一個表中。這會導致雙重遞增,因爲RULES重寫查詢,所以new.id最終成爲「我們上次計算new.id所做的任何事情」(這意味着再次遞增序列)。

如果它是一致的,最可能的原因IMO是有人創建DO ALSO規則而不完全瞭解陷阱。

相關問題