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 的 WHERE 条件下使用 Postgres JSON 运算符?