如何在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
相关产品推荐
相关产品推荐

