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();

これは、アプリケーションの 1 つで使用しているコードの単純化されたバージョンです。アプリケーション自体は Java で書かれており、MySQL データベースに接続します。IGNORE と ON DUPLICATE KEY UPDATE を使用する複数の挿入クエリを持つトランザクションを作成しようとしています。この例のテーブルには、PRIMARY KEY に設定された serial という名前の列が 1 つ含まれています。私が抱えている問題は、次のようになっていることです。

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)

最初は、トランザクションを完全に削除してすべてが機能するまで、SQLで何か間違ったことをしていると思いました....トランザクションとしてではなく、かなりの問題です。何がうまくいかないのですか?ドライバーは単純に IGNORE と ON DUPLICATE KEY を無視するのでしょうか、それとも私がひどく間違ったことをしているのでしょうか? 事前に助けてくれてありがとう。

4

1 に答える 1

1

autoCommit 状態を変更した後、ステートメントを作成します。

con.setAutoCommit(false);
Statement state = con.createStatement();
于 2012-09-06T15:06:03.230 に答える