INSERT INTO 排除 ID 列违反主键唯一性约束

INSERT INTO excluding ID column violates primary key uniqueness constraint

我有一个带有 serial ID 列的 Postgres 10.6 table。

当我尝试插入时:

INSERT INTO table (col1, col2) VALUES ('foo', 'bar');

从列列表中排除 ID 列,我得到:

ERROR: duplicate key value violates unique constraint "customer_invoice_pkey"
  Detail: Key (id)=(1234) already exists.

查询的后续运行会增加错误消息中的 ID(1235、1236 等)

怎么会这样?

具有 serial 列不会阻止您插入具有 id 显式值的行。序列值只是在 INSERT 语句中未指定 id 时使用的默认值。

所以肯定有一些“流氓”插入的那种。从 PostgreSQL v11 开始,您可以使用标识列 (GENERATED ALWAYS AS IDENTITY) 来更难覆盖序列值。

您可以使用 setval 函数将序列设置为高于 table 中的最大值 id 的值来解决该问题。