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

如何在Jooq批量插入MySQL时处理重复键并更新字段

批量插入MySQL遇重复键时更新对应字段的Jooq实现

你只需要在onDuplicateKeyUpdate()的set方法中,引用当前插入行对应的字段值即可,对应MySQL原生的SET column = VALUES(column)语法,Jooq有两种类型安全的实现方式:

方式一(Jooq 3.14+ 推荐)

利用Jooq内置的Field.value()方法直接引用插入值:

dslContext
    .insertInto(USER, USER.ID, USER.NAME)
    .valuesOfRows(
        profiles.stream()
            .collect(toRowArray(
                x -> DSL.val(x.getId()),
                x -> DSL.val(x.getName())
            ))
    )
    .onDuplicateKeyUpdate()
    .set(USER.NAME, USER.NAME.value()) // 引用本次插入的NAME值
    .execute();

方式二(兼容低版本Jooq)

手动构造VALUES()函数表达式:

dslContext
    .insertInto(USER, USER.ID, USER.NAME)
    .valuesOfRows(
        profiles.stream()
            .collect(toRowArray(
                x -> DSL.val(x.getId()),
                x -> DSL.val(x.getName())
            ))
    )
    .onDuplicateKeyUpdate()
    .set(USER.NAME, DSL.field("VALUES({0})", USER.NAME.getDataType(), USER.NAME))
    .execute();

说明

两种写法最终都会生成MySQL的ON DUPLICATE KEY UPDATE name = VALUES(name)语句,当主键/唯一键重复时,会用本次批量插入行中的NAME值覆盖数据库原有字段。若需更新多个字段,继续链式调用.set()方法即可,每个字段都用相同方式引用插入值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:15:39