2016-04-26 135 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上「模擬」。 –