我正在使用「upsert」,我需要知道它是否創建了新行。 的SQL的形式爲:PostgreSQL中的Upsert(update + insert)通過JDBC/JPA返回奇怪的行數
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的運行它,它返回受影響的行數的第2個聲明。即「1行受影響」如果它插入,「0行受影響」,如果它更新。這是我所期望的。
Howevere如果我使用javax.persistence.Query對象通過JDBC + JPA運行它,我會得到相反的行爲:如果它執行更新,則返回1,插入操作返回0。
Java行爲是否可靠? 也就是說我可以對此進行編碼嗎,還是可能隨着驅動程序jar的未來版本而改變?
有沒有更好的寫作upsert的方法,以便我還可以獲取有關哪個操作的信息?
版本的詳細信息:我使用PostgreSQL 9.1,Java 6中,並且JDBC驅動程序的jar是PostgreSQL相關9.1-901.jdbc4.jar
謝謝您的幫助!
你是否在單個'executeUpdate()'調用中運行這兩個語句? – 2012-04-26 19:11:46
是的,我。兩個獨立的電話可能需要兩次往返,效率較低?或者我應該不在乎? – 2012-04-27 13:48:41
嘗試運行兩個executeUpdate()調用,看看是否給你正確的更新計數。你是不是也一次或只調用了一次'getMoreResults()'和'getUpdateCount()'? – 2012-04-27 20:47:06