Jooq 中的条件 onDuplicateKeyUpdate

Posted

技术标签:

【中文标题】Jooq 中的条件 onDuplicateKeyUpdate【英文标题】:Conditional onDuplicateKeyUpdate in Jooq 【发布时间】:2016-08-20 08:44:46 【问题描述】:

我尝试使用 jooq dsl 进行插入/更新查询。 我们的表中有一个唯一的 (MemberId, GroupId) 组合,以及一个组成员身份枚举。 在使用(MemberId、GroupId、RoleEnum)发送订阅请求时 查询应该向数据库中插入一个新条目,但如果 MemberId、GroupId 组合已经存在 - 则仅在新 RoleEnum 大于现有条目时才更新条目。

我没有通过 jooq Dsl 使用一个查询来做到这一点,所以我不得不使用两个查询(获取,然后相应地插入或更新),但随后我失去了操作的原子性......

有没有办法通过 jooqDsl 的一个查询来做到这一点?

【问题讨论】:

【参考方案1】:

jOOQ 通过以下方式模拟 PostgreSQL 9.5 对 ON CONFLICT 子句的支持:

insertInto(...).values(...).onDuplicateKeyUpdate()... mysql 语法。仅当您的表使用显式主键信息生成时,这才有可能。 (https://github.com/jOOQ/jOOQ/issues/5093,从 jOOQ 3.8 开始) mergeInto(...).key(...).values(...) 的 H2 语法。使用此语法,您可以提供显式键列列表规范,因此代码生成器不需要提供约束元信息。 (https://github.com/jOOQ/jOOQ/issues/4464,从 jOOQ 3.7 开始)。

不幸的是,jOOQ 中还没有任何原生的ON CONFLICT 支持。

【讨论】:

模拟是什么意思?它是否生成正确的代码但 jOOQ DSL 看起来不同,或者它是否生成不同的 SQL 但它的行为映射到 postgresql.org/docs/9.5/static/sql-insert.html 中定义的 ON CONFLICT 定义的行为? @Yaneeve:ON DUPLICATE KEY UPDATE 子句是 MySQL 特有的。但它的语义可以通过生成等效的ON CONFLICT 子句在 PostgreSQL 上进行模拟。 IE。 jOOQ DSL 中的onDuplicateKeyUpdate() 子句适用于两个数据库。本机在 MySQL 上,在 PostgreSQL 上“模拟”。 @LukasEder 有没有办法指定在发生冲突时使用的键,或者 Jooq 是否尝试检查任何唯一约束并添加它们? @jmluy:当然可以。介意问一个新问题,我可以在那里提供明确的答案...

以上是关于Jooq 中的条件 onDuplicateKeyUpdate的主要内容,如果未能解决你的问题,请参考以下文章

具有联接表条件的 JOOQ 更新表

在 jooq 的条件表达式中使用自定义数据类型

使用 scala 在 Jooq 中进行交易和条件更新

如何在带有 jOOQ 的 WHERE 条件下使用 Postgres JSON 运算符?

jooq multiset order 结果集通过 multiset 上的条件

如何使用 jOOQ 执行特定查询