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

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

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)

完美解决,自测通过

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/13518051.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-12-19
下一篇 2023-12-21

发表评论

登录后才能评论

评论列表(0条)

保存