Поддръжка на jOOQ MERGE за условно вмъкване на PostgreSQL

Разбрах, че jOOQ ще симулира SQL MERGE на системи (като PostgreSQL), които не го поддържат.

Имам таблица със серийна (автоматично нарастване) колона „id“ и колона „uri“ с низ. Искам да използвам цифрови идентификатори вместо URI в моята база данни, така че трябва да се уверя, че имам URI в таблицата за търсене на ID. Следвайки примера в ръководството на jOOQ, реших, че това ще свърши работа:

createDSLContext().mergeInto(tableByName("uris"))
.using(createDSLContext().selectOne())
.on(fieldByName("uri").equal("http://example.com/"))
.whenNotMatchedThenInsert(fieldByName("uri"))
.values("http://example.com/").execute();

Това ми дава DataAccessException, казвайки нещо като:

SQL [merge into "uris" using (select 1) on "uri" = ? when not matched then insert ("uri") values (?)]; ERROR: syntax error at or near "merge"

Но след това регистрационният файл казва, че jOOQ продължава и се опитва да изпълни заявката със стойности на свързване. Но таблицата никога не се актуализира. Така че предполагам, че jOOQ не симулира MERGE на PostgreSQL?

Така че след това опитвам синтаксиса на базата данни H2:

createDSLContext().mergeInto(tableByName("uris"), fieldByName("uri")).values(uri.toString()).execute();

Взимам:

The H2-specific MERGE syntax is not supported in dialect : POSTGRES

Какво!? Но документацията на jOOQ казва, че синтаксисът H2 "може да бъде напълно симулиран от jOOQ за всички други бази данни, които поддържат SQL стандарта." Със сигурност PostgreSQL поддържа SQL стандарта. Наистина ли означава "...стандартната SQL версия на MERGE?"

Има ли някакъв начин да получа поддръжка на PostgreSQL за MERGE чрез jOOQ, или съм останал да правя същите заобиколни решения, които бих направил така или иначе?


person Garret Wilson    schedule 11.04.2014    source източник


Отговори (2)


За да сте сигурни дали дадена SQL функция се поддържа от jOOQ за вашата база данни, моля, разгледайте @Support анотация за съответния DSL метод. Това също е документирано в ръководството. В този случай, DSLContext.mergeInto(), където можете да видите, че този израз в момента се поддържа само за тези SQLDialects :

@Support(value={CUBRID,DB2,HSQLDB,ORACLE,SQLSERVER,SYBASE})

MERGE е много мощен израз, който не е много лесен за емулиране, ако вашата база данни не го поддържа първоначално.

"може да бъде напълно симулиран от jOOQ за всички други бази данни, които поддържат SQL стандарта." Със сигурност PostgreSQL поддържа SQL стандарта. Наистина ли означава "...стандартната SQL версия на MERGE?"

Да, разбира се, SQL стандартният оператор MERGE трябва да се поддържа :-) Ще изясним това в ръководството. Регистрирах проблем #3183 за това.

Има ли някакъв начин да получа поддръжка на PostgreSQL за MERGE чрез jOOQ, или съм останал да правя същите заобиколни решения, които бих направил така или иначе?

В момента, за съжаление, нямаме решение за това в PostgreSQL. Чувствайте се свободни да обсъждате възможни решения в JOOQ потребителска група.

person Lukas Eder    schedule 12.04.2014

Да, може да поддържа коя база данни поддържа сливането в SQL стенда. но postgresql не поддържа тази функция в стандарта SQL. Моля, вижте F312 оператор MERGE
F313 Подобрен оператор MERGE
F314 оператор MERGE с клон DELETE

http://www.postgresql.org/docs/9.3/static/unsupported-features-sql-standard.html

person digoal.zhou    schedule 11.04.2014