0

我正在使用“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 中运行它,它会返回第二条语句的受影响行数。即“1 行受影响”如果它执行插入,“0 行受影响”如果它执行更新。这是我所期望的。

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

Java 行为是否可靠?即我可以对此进行编码,还是可能会随着驱动程序 jar 的未来版本而改变?

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

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

谢谢您的帮助!

4

1 回答 1

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() 代码示例。

于 2012-04-26T18:47:22.970 回答