odoo开发笔记 -- 安装模块异常,数据库提示:DETAIL Key(id)=(19) already exists.
场景描述:
安装新模块的时候,提示数据库违反唯一约束:
psycopg2.IntegrityError:duplicate key value violates unique constraint "product_category_pkey" DETAIL Key(id)=(19) already exists.
原因分析:
违反主键唯一约束,说明在安装该新模块的时候,需要往相应表里创建新数据,插入数据时,相关表的id出现冲突,提示已经id已经存在,这里的表是“商品类目:product_category”表,而表的ID是自动增长的,表里边已经存在手动导入的1万多条数据,那为什么id还是19或者10几,正常来讲应该是现有数据的1万多起步!
问题出在哪里?
从日志提示中发现,插入数据时,提示表的product_category_id_seq冲突,也就是创建一条新数据,下一个id并不是现有最大行数10135的下一位1036!因此,要解决这个问题,需要我们设置下数据库该表的自增序列起始值。---进一步确认问题,发现是由于:表“商品类目”数据是手动导入的,用了自己的ID,没有触发数据库设置的表ID自动增长。---所以,后续往数据库表里手动导入数据时,也要注意这点。
问题处理:
--- 把当前最大的id做为当前的id自增起始数 --- 语法: select setval('your_table_id_seq',(select max(id) from 表名)); --- 这里实际执行: select setval('product_category_id_seq',(select max(id) from product_category));
注意:上边的语句看着是select查询语句,其实它会对数据库记录做修改,所以,执行的时候,要小心 !
补充:
也可以通过工具: DBeaver,去手动修改,数据库默认自增序列: