技術 · 實用指南
PostgreSQL 產生 ID 出現重複鍵?先證明序列錯位再用 setval
先讀約束與衝突值,確認鍵由誰產生,用目錄解析所屬序列,並在單點修復前停止寫入者。業務鍵重複或並行競態需要另一條路徑。

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。
