2014-04-11 1 views
0

jOOQ는 PostgreSQL과 같은 시스템에서 SQL MERGE를 지원하지 않는다는 것을 이해했습니다.PostgreSQL 조건부 삽입을위한 jOOQ MERGE 지원

시리얼 (자동 증가) "id"열과 "uri"열이있는 테이블이 있습니다. 데이터베이스의 URI 대신 숫자 ID를 사용하여 ID 조회 테이블에 URI가 있는지 확인해야합니다.

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 설명서의 예 다음, 나는이 일 것이라고 생각 바인드 값을 가지는 쿼리 그러나 테이블은 결코 업데이트되지 않습니다. 그래서 jOOQ가 PostgreSQL에서 MERGE를 시뮬레이트하지 않는다고 추측하고 있습니까?

그래서 나는 다음 H2 데이터베이스 구문을 시도 :

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

를 내가 얻을 :

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

무슨!? 그러나 jOOQ documentation은 H2 구문이 "SQL 표준을 지원하는 다른 모든 데이터베이스에 대해 jOOQ에 의해 완전히 시뮬레이션 될 수 있습니다."라고 말합니다. 분명히 PostgreSQL은 SQL 표준을 지원합니다. 정말로 "... MERGE의 SQL 표준 버전"을 의미합니까?

PostgreSQL에서 jOOQ를 통해 MERGE를 지원할 수있는 방법이 있습니까? 아니면 어쨌든 동일한 해결 방법을 수행하고 있습니다.

답변

1

주어진 SQL 기능은 데이터베이스에 대한 jOOQ 지원하는 경우 확실히, 고려하시기 바랍니다 Javadoc의의 관련 DSL 메소드에 대한 @Support 주석. This is also documented in the manual. 이 문은 현재는 이러한 SQLDialects 지원되는 것을 볼 수 있습니다이 경우, DSLContext.mergeInto()에서 :

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

MERGE는 데이터베이스가 기본적으로 지원하지 않는 경우 에뮬레이션 정말 쉽지 않다 매우 강력한 성명입니다 .

"SQL 표준을 지원하는 다른 모든 데이터베이스의 경우 완전히 jOOQ로 시뮬레이션 할 수 있습니다." 분명히 PostgreSQL은 SQL 표준을 지원합니다. 정말로 "... MERGE의 SQL 표준 버전"을 의미합니까?

물론 SQL 표준 MERGE 문을 지원해야합니다 .-) 우리는 설명서에서이를 분명히 할 것입니다. 이에 대해 issue #3183을 등록했습니다.

jOOQ를 통해 MERGE에 PostgreSQL 지원을 제공 할 수있는 방법이 있습니까? 아니면 어쨌든 동일한 해결 방법을 수행하고 있습니다.

지금 당장은 불행히도 PostgreSQL에서는 해결책이 없습니다. jOOQ User Group에서 가능한 해결책을 논의하십시오.