テーブルに行を挿入しようとするクエリがあります。その ID を持つ行が既に存在するため、主キー制約が失敗したためにクエリが失敗する可能性があります。
挿入を試みる前にこれを確認できましたが、SQLException の SQL 状態を確認することでこれを検出することもできます。これは、この種のことを行う有効な方法ですか? または、事前に明示的なチェックを行う必要がありますか?
私が尋ねる理由は、挿入を実行する前に明示的なチェックを行う必要がある場合、矛盾を防ぐためにチェックしているテーブルをロックする必要があるからです。エラー コード チェックを使用すると、テーブルをロックする必要がなくなります。
事前に確認
try {
con.setAutoCommit(false);
con.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
Statement statement = con.createStatement();
ResultSet rs = statement.executeQuery("SELECT * FROM SomeTable WHERE Id = 123");
if(rs.next()) {
con.setAutoCommit(true);
System.err.println("Entry with Id 123 already exists!");
return;
}
statement = con.createStatement();
statement.executeQuery("INSERT INTO SomeTable(Id) VALUES(123)");
con.commit();
con.setAutoCommit(true);
} catch(SQLException e) {
// These 2 lines actually need to be wrapped in a try/catch too.
con.rollback();
con.setAutoCommit(true);
}
エラーコードチェック
try {
Statement = con.createStatement();
statement.executeQuery("INSERT INTO SomeTable(Id) VALUES(123)");
} catch(SQLException e) {
if(e.getSQLState().equals("23505"))
System.err.println("Entry with Id 123 already exists!");
}