使用JDBC参数标记的Postgresql upsert[英] Postgresql upsert with JDBC parameter markers

本文是小编为大家收集整理的关于使用JDBC参数标记的Postgresql upsert的处理方法,想解了使用JDBC参数标记的Postgresql upsert的问题怎么解决?使用JDBC参数标记的Postgresql upsert问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一个 INSERT 语句,当使用参数标记从 JDBC 调用时,它现在可以工作:

INSERT INTO errorqueue as eq (jobname, sourceid, item) VALUES(?,?,?)

在我的 Java 代码中,我绑定了参数:

Connection connection=null;
PreparedStatement stmt=null;
try {

    connection = getConnection();
    stmt = connection.prepareStatement(sqlInsert);

    stmt.setString(1, this.jobName);
    stmt.setString(2, errorItem.getId());
    stmt.setString(3, item.getBody());
    stmt.executeUpdate();
} catch () {
...
}

如果我将其转换为 UPSERT,我正在为如何处理参数而苦苦挣扎:

INSERT INTO errorqueue as eq (jobname, sourceid, item) VALUES(?,?,?) ON CONFLICT (jobname,sourceid) UPDATE eq SET item=? Where jobname=? and sourceid=?;

这是偷偷摸摸的,但在 INSERT 中参数顺序是 (a,b,c) 但在更新中,参数绑定需要是 (c,a,b)

推荐答案

你根本不需要 on conflict 部分的参数.只需使用 set item = excluded.item.而且您也不需要 where 子句进行更新:

INSERT INTO errorqueue as eq 
   (jobname, sourceid, item) 
VALUES(?,?,?) 
ON CONFLICT (jobname,sourceid) 
  UPDATE SET item=exluded.item;

您可以保留 Java 代码原样,Postgres 将负责匹配正确的行.

本文地址:https://www.itbaoku.cn/post/1764003.html