Watch at Ease看见世界,读懂生活。

技术 · 实用指南

PostgreSQL 生成 ID 出现重复键?先证明序列错位再用 setval

先读约束与冲突值,确认键由谁生成,用目录解析所属序列,并在单点修复前停止写入者。业务键重复或并发竞态需要另一条处理路径。

原创图:从约束、默认值和所属序列区分业务键冲突与序列错位。
原创插画:先识别冲突键和生成器。 Watch at Ease

PostgreSQL 重复键只证明某个受约束值已存在,并不证明主键序列错误。

保存约束和冲突值,确认数据库还是应用生成键,再在受控写入条件下比较目录解析的序列与表。

保存约束与冲突值

保存完整错误、约束名、DETAIL 键值及语句形态。邮箱或 SKU 冲突不能靠重置 ID 序列修复。

记录 ID 是否显式提供,以及导入、种子、恢复、切换或手工写入等前置变化。

证明实际生成机制

检查列默认值或 identity,并用 pg_get_serial_sequence 解析真实所属序列,不能猜名字。

应用显式给键、复合约束或业务键时,应转查重试、幂等和来源数据。

不推进地比较状态

比较 MAX(id)、last_value 与 is_called;不要为查看而调用 nextval。

先核起始值、步长、范围、循环与空表;自定义或降序序列不能套用通用公式。

停止写入后定点修复

维护窗口内停止应用和加载器;setval 立即可见且回滚不会撤销。

仅对已证明的非空、步长为一的所属序列把当前值设为最大 ID;空表按真实起始值和 is_called=false 处理。

验证并关闭根因

恢复一个写入者,做一次不提供 ID 的受控插入,核对新键、提交行与序列方向。

修复显式 ID 加载、复制或故障转移流程;再次错位时不要只反复推高 setval。

原创图:停止写入、定点修复、验证与复发调查。
原创插画:在维护窗口内只修复已证明的序列边界。 Watch at Ease