Postgresql

為什麼 Postgres 會生成一個已經使用過的 PK 值?

  • August 10, 2021

我正在使用 Django,並且每隔一段時間我就會收到此錯誤:

IntegrityError:重複鍵值違反唯一約束“myapp_mymodel_pkey”

詳細資訊:鍵 (id)=(1) 已存在。

我的 Postgres 數據庫實際上有一個主鍵為 1的myapp_mymodel對象。

為什麼 Postgres 會再次嘗試使用該主鍵?或者,這很可能是我的應用程序(或 Django 的 ORM)造成的嗎?

剛才這個問題連續出現了3次。我發現,當它確實發生時,對於給定的表,它會連續發生一次或多次,然後不會再發生。它似乎在每張桌子完全停止幾天之前發生,當它確實發生時每張桌子至少發生一分鐘左右,並且只是間歇性地發生(不是所有桌子都立即發生)。

這個錯誤是如此斷斷續續(在 2 週內僅發生 3 次左右 - 數據庫上沒有其他負載,只有我測試我的應用程序)這一事實讓我對低級問題如此警惕。

PostgreSQL 不會嘗試自己插入重複值,而是由您(您的應用程序,包括 ORM)執行。

它可以是一個序列,將值提供給 PK 設置到錯誤的位置,並且表已經包含與其相等的值nextval()- 或者只是您的應用程序做錯了事情。第一個很容易解決:

SELECT setval('your_sequence_name', (SELECT max(id) FROM your_table));

第二個意味著調試。

Django(或任何其他流行的框架)不會自行重置序列 - 否則我們每隔一天就會遇到類似的問題。

引用自:https://dba.stackexchange.com/questions/46125