2016-04-26 3 views
2

Я попытался использовать jooq dsl для запроса на вставку/обновление. У нас есть уникальная комбинация (MemberId, GroupId) в нашей таблице и членство в группе Enum. При отправке запроса на подписку с помощью (MemberId, GroupId, RoleEnum) Запрос должен вставить новую запись в db, но если уже существует команда MemberId, GroupId, то только обновить запись, если новый RoleEnum больше существующего один.Условный onDuplicateKeyUpdate в Jooq

мне не удалось сделать это с помощью одного запроса с jooq Dsl, так что вместо этого я должен был использовать два запроса (GET, а затем вставить или обновить соответственно), но тогда я потеряю атомарность операции ...

Есть ли способ сделать это с помощью одного запроса с jooqDsl?

ответ

3

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.

+0

Что означает эмулировать? Создает ли он правильный код, но jOOQ DSL выглядит иначе, или он генерирует другой SQL, но его поведение сопоставляется с определениями 'ON CONFLICT', как определено в http://www.postgresql.org/docs/ 9.5/static/sql-insert.html? – Yaneeve

+1

@Yaneeve: предложение 'ON DUPLICATE KEY UPDATE' является специфичным для MySQL. Но его семантика может быть эмулирована на PostgreSQL путем создания эквивалентного предложения ON ON CONFLICT. То есть предложение 'onDuplicateKeyUpdate()' в jOOQ DSL будет работать в обеих базах данных. Натурально на MySQL и «эмулируется» на PostgreSQL. –

Смежные вопросы