当前位置: 首页 > 知识库问答 >
问题:

jOOQ MERGE支持PostgreSQL条件插入

洪国兴
2023-03-14

我知道jOOQ将在不支持它的系统(如PostgreSQL)上模拟SQLMERGE。

我有一个带有串行(自动增量)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标准。这真的意味着"...合并的SQL标准版本?”

有没有办法通过jOOQ获得PostgreSQL对MERGE的支持,或者我一直在做我会做的工作?

共有2个答案

贾俊喆
2023-03-14

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

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

仲孙英才
2023-03-14

要确保Jooq为您的数据库提供了给定的SQL特征,请考虑有关DSL方法的JavaDoc的<代码> @支持< /代码>注释。手册中也记录了这一点。在本例中,DSLContext。mergeInto(),您可以看到此语句当前仅支持这些SQLDiagnotes

java prettyprint-override">@Support(value={CUBRID,DB2,HSQLDB,ORACLE,SQLSERVER,SYBASE})

MERGE是一个非常强大的语句,如果您的数据库本身不支持它,就不太容易模拟。

“jOOQ可以完全模拟所有其他支持SQL标准的数据库。”当然,PostgreSQL支持SQL标准。它是否真的意味着“…合并的SQL标准版本?”

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

有没有办法通过jOOQ获得PostgreSQL对MERGE的支持,或者我一直在做我会做的工作?

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

 类似资料:
  • Tabris.js API主要是一个UI/控件的库,还有一些额外的受浏览器启发的API。为了提供它们不涉及的功能,Tabris.js可以使用Apache Cordova插件进行扩展。 Cordova插件的JavaScript API文档在Tabris.js中也是有效的,只有一个小例外:在访问插件API之前,无需监听deviceready事件。当加载应用程序主模块时,所有插件都将准备就绪。 默认插件

  • 问题内容: 我无法让Hibernate使用PostgreSQL的java.util.UUID。 这是使用javax.persistence。*批注的映射: 当持久化一个临时对象时,我得到一个SQLGrammarException: PostgreSQL版本是8.4.4 JDBC驱动程序-8.4.4-702(也尝试过9.0-相同) Hibernate版本是3.6,主要配置属性: 问题答案: 可以通过

  • 我尝试使用r2dbc执行批处理插入。 我已经看到,使用spring boot中的DatabaseClient,这还不可能实现。我尝试使用R2DBC SPI语句和and方法来实现这一点,如下所示: 我在日志上看到完成了两个插入请求。 添加是执行批更新还是只运行两个请求? 谢谢

  • 我正在尝试运行我的项目,它运行没有任何问题,但在我更新Android Studio后…我有一个错误,我不知道我使用了哪个android studio版本之前,更新降级到它。 Android Gradle插件只支持Kotlin Gradle插件1.3.0及更高版本。以下依赖项不满足所需版本:项目':assets_audio_player'->org.jetbrains.kotlin:kotlin-g

  • 我正在通过gradle-intellij-plugin使用IntelliJ SDK编写一个插件。 我还将智能J插件的罐子添加到SDK类路径中 任何想法的原因?如何为这些专家/格拉德的东西引入支持?

  • 1.2. jQuery支持2种插件方式 $.somePlugin $.fn.somePlugin 1.2.1. Global工具类的插件 比如 $.trim('hello world ') 这个方法是用于去掉空格的工具方法。它其实是给jQuery对象上增加了trim方法。 此种插件一般是工具类的方法。 1.2.2. 基于selector的插件 比如 $('.mytab').tab({