SpringBoot+PostgreSQL主键设自增仍报front_menu_id非空约束错误
问题排查与解决方案
这个报错的核心原因是数据库表的front_menu_id字段没有配置自增属性,仅在实体类注解配置自增不会生效,需要同时完成数据库侧和框架侧的配置,按以下步骤排查修复即可:
步骤1:修复数据库表主键自增配置
你此前都是手动录入主键,建表时大概率没有给主键字段设置自增规则,PostgreSQL的自增配置和MySQL不同,按以下操作调整:
- 先查询当前表的最大主键值,避免后续自增和已有的主键冲突:
SELECT MAX(front_menu_id) FROM front_menu_table;
记下来查询到的最大值,假设为max_id,后续自增起始值设为max_id + 1即可。
2. 根据你的PostgreSQL版本选择对应配置方式:
情况A:PostgreSQL 10及以上版本(推荐)
直接将字段设置为身份列,适配自增需求:
-- 手动传主键时用传入值,不传则自增,适配你之前手动录入主键的场景 ALTER TABLE front_menu_table ALTER COLUMN front_menu_id ADD GENERATED BY DEFAULT AS IDENTITY; -- 调整自增起始值,替换下面的[max_id + 1]为你第一步查出来的数值加1 ALTER SEQUENCE front_menu_table_front_menu_id_seq RESTART WITH [max_id + 1];
情况B:PostgreSQL 10以下版本
手动创建序列并绑定到主键字段的默认值:
-- 创建序列,替换[max_id + 1]为你第一步查出来的数值加1 CREATE SEQUENCE front_menu_table_front_menu_id_seq START WITH [max_id + 1]; -- 绑定序列到主键默认值 ALTER TABLE front_menu_table ALTER COLUMN front_menu_id SET DEFAULT nextval('front_menu_table_front_menu_id_seq');
步骤2:确认MyBatis-Plus主键策略没有冲突
如果数据库配置完还是报错,检查框架全局配置是否覆盖了实体类的主键注解:
- 查看
application.yml/application.properties配置文件,确认没有全局配置主键策略覆盖注解,或者全局策略设为auto:
mybatis-plus: global-config: db-config: # 要么删掉这行配置优先使用实体类@TableId的配置,要么设为auto id-type: auto
- 查看MyBatis-Plus配置类,确认没有代码层面设置全局主键类型为非auto的值,如果有则调整或者删除。
额外说明
你之前手动录入主键导致的序号混乱问题,只要按步骤1调整好自增序列的起始值,就不会对后续新增操作产生任何影响。
内容的提问来源于stack exchange,提问作者Showen
相关产品推荐
相关产品推荐

