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

使用UUID()生成主键时GeneratedKeyHolder无法返回MySQL插入ID

问题分析与解决方法

核心问题1:表名拼写错误

你的插入SQL语句中写的是INSERT INTO CUSTOMER1,但实际定义的表名为CUSTOMER,这会导致插入操作要么失败(如果CUSTOMER1不存在),要么插入到错误的表中,这是首先要修正的问题。

核心问题2:UUID主键无法通过RETURN_GENERATED_KEYS获取

MySQL的Statement.RETURN_GENERATED_KEYS仅对自增(AUTO_INCREMENT)列生效,而你的CUSTOMER_ID是通过DEFAULT (UUID())生成的默认值,不属于自增列类型,因此JDBC驱动不会将其识别为“生成键”返回,这就是holder.getKey()返回null的根本原因。


可行解决方案

方案一:Java代码生成UUID并显式插入

直接在代码中生成UUID,插入时指定该值,无需依赖数据库返回,逻辑最简洁:

import java.util.UUID;
// ...
String customerId = UUID.randomUUID().toString();
jdbcTemplate.update(
    "INSERT INTO CUSTOMER (CUSTOMER_ID, MOBILE) VALUES (?, ?)",
    customerId, mobileNumber
);
return customerId;

方案二:利用MySQL 8.0+的RETURNING子句

MySQL 8.0.19及以上版本支持RETURNING子句,可以在插入语句后直接返回生成的主键值,适配你的原有代码逻辑:

GeneratedKeyHolder holder = new GeneratedKeyHolder();
int rowsAffected = jdbcTemplate.update(con -> {
    PreparedStatement stmt = con.prepareStatement(
        "INSERT INTO CUSTOMER (MOBILE) VALUES (?) RETURNING CUSTOMER_ID"
    );
    stmt.setString(1, mobileNumber);
    return stmt;
}, holder);
return holder.getKey().toString();

内容的提问来源于stack exchange,提问作者Mohammad Umair

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 19:15:57