解决PostgreSQL插入数据时主键ID重复问题

发布时间 2023-03-22 21:08:51作者: 蓝莓薄荷

问题

执行以下插入数据语句

INSERT INTO student(name) values('Tony');

抛出如下异常

ERROR:  duplicate key value violates unique constraint "student_pkey"
DETAIL:  Key (id)=(2) already exists

以上的id为自增主键,但是在插入数据的时候无法插入。

原因

在PostgreSQL中,自增主键是通过表的序列来匹配值的(上面例子中的序列为student_id_seq)。

由于当前表中已经存在id为2的数据,而当前的序列student_id_seq的值仍然为2,所以数据插入失败。

在PostgreSQL中,当我们拷贝、同步数据到一张新的表,或者插入数据时带上自增id字段等都不会影响序列的变化,所以才出现了表的记录和序列不一致的情况。

解决方法

将表的序列值更新为表记录的id最大值,执行以下SQL语句

SELECT setval('student_id_seq', (SELECT max(id) FROM student));

更新完毕,再次执行插入语句即可。