簡體   English   中英

通過JDBC / JPA在PostgreSQL中進行Upsert(update + insert)返回奇怪的行數

[英]Upsert (update+insert) in PostgreSQL via JDBC / JPA returning strange row-count

我正在使用“ 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

謝謝您的幫助!

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM