У меня есть запрос, который пытается вставить строку в таблицу. Возможно, что запрос не удастся из-за сбоя первичного ключа, потому что уже есть строка с этим идентификатором.
Я мог бы проверить это перед попыткой вставки, но я также могу обнаружить это, проверив состояние SQL SQLException. Это правильный способ сделать этот тип вещи? Или я должен сделать явную проверку перед рукой?
Причина, по которой я спрашиваю, состоит в том, что, если мне придется выполнить явную проверку перед выполнением вставки, мне придется заблокировать таблицу, из которой я проверяю, во избежание несоответствия. Использование проверки кода ошибки означает, что мне не нужно будет блокировать таблицу.
Проверьте заранее
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!");
}