【问题标题】:Upsert (update+insert) in PostgreSQL via JDBC / JPA returning strange row-count通过 JDBC / JPA 在 PostgreSQL 中更新插入(更新+插入)返回奇怪的行数
【发布时间】:2012-04-26 17:55:02
【问题描述】:

我正在使用“upsert”,我需要知道它是否创建了新行。 SQL 的格式为:

update mytable set col1='value1' where (col2='value2');
insert into mytable select 'value1', 'value2' where not exists (select 1 from mytable where (col2='value2'));

如果我在 Postgres 中运行它,它会返回第二条语句的受影响行数。 IE。 “1 行受影响”如果它执行插入,“0 行受影响”如果它执行更新。这是我所期望的。

但是,如果我使用 javax.persistence.Query 对象在 JDBC+JPA 上运行它,我会得到相反的行为:如果它执行更新,则返回 1,而插入则返回 0。

Java 行为是否可靠? IE。我可以对此进行编码吗,或者它是否会随着驱动程序 jar 的未来版本而改变?

有没有更好的方法来编写 upsert,以便我也可以获取有关它执行了哪个操作的信息?

版本详情:我使用的是PostgreSQL 9.1,Java 6,JDBC驱动jar是postgresql-9.1-901.jdbc4.jar

感谢您的帮助!

【问题讨论】:

  • 您是否在一个 executeUpdate() 调用中运行这两个语句?
  • 是的,我是。两个单独的调用可能需要两次往返并且效率较低?还是我应该不在乎?
  • 尝试运行两次 executeUpdate() 调用,看看是否为您提供了正确的更新计数。另外,您是否多次或仅一次致电getMoreResults()getUpdateCount()
  • 谢谢。使用两个 executeUpdate() 调用有效。虽然做两次数据库调用是一种耻辱,但当一个人应该覆盖它时。我不认为 getMoreResults 和 getUpdateCount 是 JPA 的一部分。

标签: java sql postgresql jpa jdbc


【解决方案1】:

在 Java 中,您应该能够根据 JDBC API 文档获取每个语句的行数:

http://docs.oracle.com/javase/6/docs/api/java/sql/Statement.html#execute%28java.lang.String%29

PostgreSQL 文档提供了一个在 plpgsql 函数中完成此操作的示例:

http://www.postgresql.org/docs/9.1/interactive/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING

查找 merge_db() 代码示例。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-06-23
  • 2014-10-16
  • 2022-01-26
  • 2012-08-19
  • 1970-01-01
  • 2016-03-16
  • 2019-03-23
  • 2023-03-31
相关资源
最近更新 更多