Watch at Ease看見世界,讀懂生活。

技術 · 實用指南

PostgreSQL 產生 ID 出現重複鍵?先證明序列錯位再用 setval

先讀約束與衝突值,確認鍵由誰產生,用目錄解析所屬序列,並在單點修復前停止寫入者。業務鍵重複或並行競態需要另一條路徑。

原創圖:區分業務鍵衝突與序列錯位。
原創插畫:先識別衝突鍵和產生器。 Watch at Ease

PostgreSQL 重複鍵只證明受約束值已存在,不證明主鍵序列錯誤。

保存約束和衝突值,確認資料庫或應用產生鍵,再於受控寫入條件比較序列與資料表。

保存約束與衝突值

保存完整錯誤、約束、DETAIL 與語句形態;業務鍵衝突不能靠序列重設。

記錄 ID 是否顯式提供及導入、seed、restore、failover 等變化。

證明實際產生機制

檢查 default 或 identity,以 pg_get_serial_sequence 解析序列,不猜名稱。

應用提供鍵或複合約束時轉查 retry、idempotency 與來源資料。

不推進地比較狀態

比較 MAX(id)、last_value、is_called;不要為檢視呼叫 nextval。

先核對 start、increment、範圍、cycle 與空表。

停止寫入後定點修復

維護窗口內停止 writer;setval 立即可見且 rollback 不撤銷。

只修已證明的序列;空表依真實 start 與 is_called=false 處理。

驗證並關閉根因

恢復一個 writer,做一次省略 ID 的受控 insert 並核對結果。

修正顯式 ID 載入、複寫或 failover;復發時不要只反覆 setval。

原創圖:停止寫入、定點修復、驗證與復發調查。
原創插畫:只修已證明的序列邊界。 Watch at Ease