You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot+MySQL下@GeneratedValue场景手动插入ID的解决方法

解决MySQL+Spring Boot手动插入ID时的"Field 'id' doesn't have a default value"问题

核心原因

你使用的@GeneratedValue(strategy = GenerationType.AUTO)在MySQL环境下,JPA可能会适配为TABLE序列生成策略(而非MySQL原生的自增IDENTITY),此时数据库表的ID字段既没有自增属性,也没有默认值,手动插入时不指定ID就会触发该错误。

解决方案

方案1:改用MySQL自增主键(推荐)

这是最贴合MySQL特性的方案,既能让JPA自动生成ID,也支持手动插入时灵活处理:

  1. 修改实体类注解:将ID字段的生成策略改为IDENTITY:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
  1. 确保数据库表ID字段自增:如果表已创建,执行ALTER语句修改:
ALTER TABLE your_table MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;
  1. 手动插入的两种方式:
    • 不指定ID字段:直接插入其他字段,数据库自动生成ID:
      INSERT INTO your_table (name, age) VALUES ('张三', 25);
      
    • 手动指定ID(需确保ID未被占用):若必须自定义ID,直接传入唯一值即可,MySQL会优先使用你传入的值(前提是sql_mode未限制自增字段手动赋值):
      INSERT INTO your_table (id, name, age) VALUES (1001, '李四', 30);
      

方案2:手动指定唯一ID(无需自增)

如果不需要数据库自增,完全手动管理ID:

  1. 调整实体类注解:可暂时移除@GeneratedValue,或保留但插入时手动赋值(JPA会优先使用你设置的ID值):
@Id
private Long id;
  1. 插入时明确赋值:每次插入都传入唯一的ID值(比如用UUID转成数值,或维护一个独立的ID序列):
INSERT INTO your_table (id, name) VALUES (UUID_SHORT(), '王五');

注意:这种方式需自行保证ID的唯一性,避免主键冲突。

方案3:给ID字段设置默认值(不推荐)

给数据库ID字段添加默认值,比如用时间戳或UUID,但这种方式易出现重复ID,仅适合特殊场景:

ALTER TABLE your_table MODIFY COLUMN id INT PRIMARY KEY DEFAULT UUID_SHORT();

内容的提问来源于stack exchange,提问作者Fatih AKSOY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:57:16