解决PostgreSQL插入数据时主键ID重复问题
问题
执行以下插入数据语句
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));
更新完毕,再次执行插入语句即可。