2012-09-06 96 views
0
Connection con= DriverManager.getConnection("jdbc:mysql://"+ host, user, pass); 
Statement state = con.createStatement(); 

con.setAutoCommit(false); 

state.executeUpdate("INSERT IGNORE `kb_manage`.`serial` (`serial`) VALUES ('10001')"); 

state.executeUpdate("INSERT `kb_manage`.`serial` (`serial`) VALUES ('10001') ON 
DUPLICATE KEY UPDATE `serial`='10002'"); 

con.commit(); 

這是我在其中一個應用程序中使用的簡化版代碼。應用程序本身是用java編寫的,並連接到MySQL數據庫。我試圖做一個事務,它有多個使用IGNORE和ON DUPLICATE KEY UPDATE的插入查詢。這個例子中的表包含1個名爲serial的列,它被設置爲PRIMARY KEY。我有問題的是,我得到一個:java MySQL事務/ INSERT IGNORE和ON DUPLICATE KEY UPDATE

java.sql.SQLException: DUP_PK_KEY 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2618) 
at com.mysql.jdbc.ConnectionImpl.commit(ConnectionImpl.java:1654) 
at remote.SerialValue.main(SerialValue.java:19) 

起初我還以爲是我做錯了什麼與SQ​​L,直到在那裏我完全刪除交易和一切工作點....只是沒有這是一個相當成問題的交易。有什麼想法出錯?司機是否簡單地忽略IGNORE和ON DUPLICATE KEY,還是我在做一些非常錯誤的事情?我在這裏先向您的幫助表示感謝。

+1

什麼版本的MySQL您使用的是?插入和更新的邏輯只是有點令人困惑,因爲它只是一個代碼示例? :-) –

回答

1

更改自動提交狀態後,創建聲明:

con.setAutoCommit(false); 
Statement state = con.createStatement(); 
+0

不錯,我沒有意識到這會有所作爲。 –

相關問題