0

我知道 jOOQ 会在不支持它的系统(例如 PostgreSQL)上模拟 SQL MERGE。

我有一个带有串行(自动增量)“id”列和字符串“uri”列的表。我想在我的数据库中使用数字 ID 而不是 URI,所以我必须确保在 ID 查找表中有一个 URI。因此,按照 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 不会在 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 文档说 H2 语法“可以由 jOOQ 完全模拟支持 SQL 标准的所有其他数据库”。PostgreSQL 肯定支持 SQL 标准。它真的意味着“...... MERGE 的 SQL 标准版本吗?”

有什么方法可以通过 jOOQ 获得对 MERGE 的 PostgreSQL 支持,还是我坚持做我会做的相同的解决方法?

4

2 回答 2

1

要确定 jOOQ 是否支持您的数据库的给定 SQL 功能,请考虑@Support相关 DSL 方法上的 Javadoc 注释。这也记录在手册中。在这种情况下,DSLContext.mergeInto()您可以看到此语句当前仅支持这些SQLDialects

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

MERGE是一个非常强大的语句,如果您的数据库本身不支持它,则很难模拟它。

“可以由 jOOQ 完全模拟支持 SQL 标准的所有其他数据库。” PostgreSQL 肯定支持 SQL 标准。它真的意味着“...... MERGE 的 SQL 标准版本吗?”

是的,当然,MERGE必须支持 SQL 标准语句 :-) 我们将在手册中阐明这一点。我为此注册了issue #3183

有什么方法可以通过 jOOQ 获得对 MERGE 的 PostgreSQL 支持,还是我坚持做我会做的相同的解决方法?

现在,不幸的是,我们在 PostgreSQL 中没有解决方案。随意在jOOQ 用户组上讨论可能的解决方案。

于 2014-04-12T06:41:28.583 回答
0

是的,它可以支持哪个数据库支持 SQL 站中的合并。但 postgresql 在 SQL 标准中不支持此功能。请参阅 F312 MERGE 语句
F313 增强的 MERGE 语句
F314 带有 DELETE 分支的 MERGE 语句

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

于 2014-04-11T23:41:29.973 回答