2016-04-26 132 views
2

我试图使用jooq dsl进行插入/更新查询。 我们在表中有一个唯一的(MemberId,GroupId)组合和一个组成员资格Enum。 使用(MemberId,GroupId,RoleEnum)发送订阅请求 查询应向数据库插入新条目,但如果MemberId,GroupId组合已存在 - 则只有在新RoleEnum大于现有值时更新条目一。Jooq中的条件onDuplicateKeyUpdate

我没能做到这一点使用一个与jooq的Dsl查询,所以不是我只好用两个查询(GET,然后插入或相应更新),但后来我失去了操作的原子性...

有没有办法做到这一点与jooqDsl一个查询?

回答

3

jOOQ模仿的PostgreSQL 9.5的通过为ON CONFLICT条款支持:

  • MySQL的句法insertInto(...).values(...).onDuplicateKeyUpdate()...。这只有在您的表生成时使用显式主键信息才有可能。 (https://github.com/jOOQ/jOOQ/issues/5093,因为JOOQ 3.8)
  • mergeInto(...).key(...).values(...) H2语法。使用这种语法,您可以提供明确的键列列表规范,因此代码生成器不需要提供约束元信息。 (https://github.com/jOOQ/jOOQ/issues/4464,自从第3.7条)。

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

+0

模拟是什么意思?它是否会生成正确的代码,但是jOOQ DSL看起来不同,还是会生成不同的SQL,但它的行为映射到http://www.postgresql.org/docs/中定义的“ON CONFLICT”定义的行为上9.5/static/sql-insert.html? – Yaneeve

+1

@Yaneeve:'ON DUPLICATE KEY UPDATE'子句是MySQL特有的。但是它的语义可以在PostgreSQL上通过生成等价的'ON CONFLICT'子句来模拟。即jOOQ DSL中的'onDuplicateKeyUpdate()'子句适用于两个数据库。本地在MySQL上,并在PostgreSQL上“模拟”。 –