postgresql增序列报错问题ERROR: duplicate key value violates unique constraint “sys_department_pkey”
最近使用postgres数据库遇到一个问题,新增数据的时候报duplicate key value violates unique constraint;
报错代码:
\### SQL: insert into sys_department(parent_id, dept_name, created_user_id, updated_user_id, admin_area, all_data_permission) values (?, ?, ?, ?, ?, ?) ### Cause: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "sys_department_pkey" 详细:Key (id)=(7) already exists. ; ERROR: duplicate key value violates unique constraint "sys_department_pkey" 详细:Key (id)=(7) already exists.; nested exception is org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "sys_department_pkey" 详细:Key (id)=(7) already exists.
问题分析:
可以看到上面新增一条语句的时候,提示我们( 错误:重复的键值违反了唯一约束“sys_department_pkey”) 可以看到详细信息是id自增到7重复了;
查了一下网上说的序列的自增Id和设置的最大ID不匹配,才想到是由于,之前给客户导数据的时候把id也导进去了,缺没有把序列的值改成导完之后的最大值导致数据库后面有两条id一样的记录,才导致根据id更新数据会查到两条数据,加上我正好把一个字段设成了主键,更新的时候由于主键必须唯一,导致更新直接抛异常了。
导数据或者导数据库之后,如果用到了序列一定要把序列的值更新到最大值
如何修改:
-
先查询表使用的那个自增序列
SELECT pg_get_serial_sequence('sys_department', 'id');
这个是查询部门表使用的那个自增序列
-
然后查询自增序列下一个值是什么(更好的排查问题)
Select nextval('public.sys_department_id_seq1');
这样可以看到下一个正好是7,所以是重复了。但是由于是导入的数据,目前已经到42了,所以需要我们手动去修改最大值
-
手动修改序列的值更新到最大值
打开表,看看最新一条数据的id到多少号了,例如一共42条数据,那么最大设置到43即可
SELECT setval('public.sys_department_id_seq1', 43);
或者 一步解决
SELECT setval('public.sys_department_id_seq1', (SELECT MAX(id) FROM sys_department)+1)
完美解决,自测通过
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)