postgresql增序列报错问题ERROR: duplicate key value violates unique constraint “sys_department_pkey”

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更新数据会查到两条数据,加上我正好把一个字段设成了主键,更新的时候由于主键必须唯一,导致更新直接抛异常了。

导数据或者导数据库之后,如果用到了序列一定要把序列的值更新到最大值

如何修改:

  1. 先查询表使用的那个自增序列

    SELECT pg_get_serial_sequence('sys_department', 'id');
    

    这个是查询部门表使用的那个自增序列

  2. 然后查询自增序列下一个值是什么(更好的排查问题)

    Select nextval('public.sys_department_id_seq1');
    

    这样可以看到下一个正好是7,所以是重复了。但是由于是导入的数据,目前已经到42了,所以需要我们手动去修改最大值

  3. 手动修改序列的值更新到最大值

    打开表,看看最新一条数据的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)
    

完美解决,自测通过

你可能感兴趣的:(joe,study,异常问题,postgresql,oracle,数据库)