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)
    

完美解决,自测通过

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值