INSERT 违反主键的唯一键约束

dak*_*kay 3 postgresql

在主键“id”且默认值为 nextval() 的表上,插入一行会引发错误

Query 1 ERROR: ERROR:  duplicate key value violates unique constraint "table_pkey"
DETAIL:  Key (id)=(6) already exists.
Run Code Online (Sandbox Code Playgroud)

除了这个表有 200 行。为什么 Postgres 不将新行 id 设置为 201?

小智 7

您手动将行插入到表中,为id列提供显式值,这意味着序列未高级,因为未使用默认值。现在您的序列与表中的实际值不同步。

如果您这样做,则需要将序列setval()与实际值同步:

select setval( pg_get_serial_sequence('the_table', 'id'), 
               (select max(id) from the_table)
             );
Run Code Online (Sandbox Code Playgroud)

如果您想防止将来出现此类问题,您可以将该列重新定义为identity将拒绝为其传递显式值的列,这样,如果您尝试绕过默认值,就会收到错误。