Java 批量数据库操作怎么处理唯一键冲突实现 ON DUPLICATE KEY UPDATE 批量更新

陌强君_4559

陌强君_4559

2026-09-23

894人浏览

原创

mysql的on duplicate key update支持单条语句批量upsert:多行insert中每行独立触发冲突检测,update子句用values(col)引用对应行值,所有行共用同一更新逻辑,需主键或唯一索引生效。

java 批量数据库操作怎么处理唯一键冲突实现 on duplicate key update 批量更新

MySQL 的 ON DUPLICATE KEY UPDATE 本身不支持直接对多行批量 INSERT 做“每行独立判断+更新”,但通过 JDBC 批量执行 + 合理 SQL 写法,可以高效实现类似效果。关键在于:用一条 INSERT ... ON DUPLICATE KEY UPDATE 语句插入多行,并在 UPDATE 子句中用 VALUES(col) 引用当前插入行的值。

SQL 层:单条语句完成批量 upsert

核心写法是把多条记录拼成一个 INSERT,配合 VALUES(col_name) 动态取值。例如:

INSERT INTO user (id, name, score, version) 
VALUES 
  (1, 'Alice', 85, 1),
  (2, 'Bob', 92, 1),
  (3, 'Charlie', 78, 1)
ON DUPLICATE KEY UPDATE 
  name = VALUES(name),
  score = VALUES(score),
  version = VALUES(version) + 1;

注意:
- VALUES(name) 指“本次 INSERT 中对应位置那行的 name 值”,不是表中已有值;
- 主键或唯一索引冲突时才触发 UPDATE;
- 所有行共用同一套 UPDATE 表达式,不能为每行写不同逻辑。

JDBC 批量执行(推荐 PreparedStatement)

避免字符串拼接 SQL,用参数化方式安全高效地绑定多组值:

  • 构造含多个 ? 占位符的 SQL(如 (?, ?, ?, ?), (?, ?, ?, ?), ...);
  • 循环调用 ps.setXXX() 设置每组参数,再调用 ps.addBatch()
  • 最后 ps.executeBatch() 一次性提交。

示例片段(简化):

String sql = "INSERT INTO user (id, name, score, version) VALUES (?, ?, ?, ?) " +
             "ON DUPLICATE KEY UPDATE name = VALUES(name), score = VALUES(score), version = VALUES(version) + 1";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
  for (User u : users) {
    ps.setLong(1, u.getId());
    ps.setString(2, u.getName());
    ps.setInt(3, u.getScore());
    ps.setInt(4, u.getVersion());
    ps.addBatch();
  }
  ps.executeBatch(); // 一次网络往返完成全部 upsert
}

注意事项与常见问题

唯一键必须存在且生效:确保表上有主键或 UNIQUE 索引,否则 ON DUPLICATE KEY UPDATE 不会触发。

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载

批量大小适中:单次插入不宜超过 1000 行(受 max_allowed_packet 和性能影响),可分批处理。

返回影响行数:JDBC 的 executeBatch() 返回的是每条语句的影响行数数组——插入新行算 1 行,更新已存在行也算 1 行。可通过它区分哪些是 insert、哪些是 update。

不支持条件更新:比如“仅当新 score > 旧 score 时才更新”,MySQL 8.0+ 可用 IF(VALUES(score) > score, VALUES(score), score) 模拟,但逻辑复杂时建议改用 MERGE 或业务层控制。

替代方案对比(何时不用 ON DUPLICATE KEY)

如果需要更复杂的冲突处理逻辑(如部分字段只 insert 不 update、多表关联判断、失败后自定义重试),可考虑:

  • REPLACE INTO:先删后插,会丢失自增 ID 和触发 DELETE 触发器,慎用;
  • INSERT IGNORE:冲突就跳过,无法更新;
  • 先 SELECT 再 INSERT/UPDATE:并发下可能产生竞态,需加锁或事务隔离;
  • MyBatis-Plus 的 saveOrUpdateBatch:底层仍是分批 select + insert/update,适合小批量或逻辑复杂场景。

对高吞吐、冲突率高的批量 upsert,原生 INSERT ... ON DUPLICATE KEY UPDATE + JDBC Batch 仍是性能最优解。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

8817

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

6042

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

5412

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

984

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

808

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1156

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2329

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19671

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1055

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习