【问题标题】:jOOQ MERGE support for PostgreSQL conditional insertjOOQ MERGE 支持 PostgreSQL 条件插入
【发布时间】:2014-05-26 06:30:49
【问题描述】:

我知道 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 documentation 表示 H2 语法“可以由 jOOQ 完全模拟支持 SQL 标准的所有其他数据库”。 PostgreSQL 肯定支持 SQL 标准。它真的意味着“……MERGE 的 SQL 标准版本吗?”

有什么方法可以通过 jOOQ 获得 PostgreSQL 对 MERGE 的支持,还是我一直在做同样的解决方法?

【问题讨论】:

    标签: sql postgresql jooq sql-merge


    【解决方案1】:

    要确定 jOOQ 是否为您的数据库支持给定的 SQL 功能,请考虑相关 DSL 方法上的 Javadoc 的 @Support 注释。 This is also documented in the manual。在本例中为DSLContext.mergeInto(),在这里可以看到目前只有这些SQLDialects支持此语句:

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

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

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

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

    有什么方法可以通过 jOOQ 获得 PostgreSQL 对 MERGE 的支持,还是我一直在做同样的解决方法?

    不幸的是,目前我们在 PostgreSQL 中没有解决方案。欢迎在jOOQ User Group 上讨论可能的解决方案。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-03-26
        • 2015-10-23
        • 1970-01-01
        • 2019-03-01
        • 2016-08-16
        • 2015-03-24
        • 2017-12-19
        • 2020-03-18
        • 2018-03-25
        相关资源
        最近更新 更多