Подтвердить что ты не робот

MySQL и Java - получить идентификатор последнего вставленного значения (JDBC)

Возможный дубликат:
Как получить идентификатор вставки в JDBC?

Привет, я использую JDBC для подключения к базе данных через Java.

Теперь, я делаю некоторый запрос на вставку, и мне нужно получить идентификатор последнего вставленного значения (так, после stmt.executeUpdate).

Мне не нужно что-то вроде SELECT id FROM table ORDER BY id DESC LIMIT 1, потому что у меня могут быть проблемы с concurrency.

Мне просто нужно получить идентификатор, связанный с последней вставкой (о моем экземпляре Statement).

Я пробовал это, но похоже, что он не работает на JDBC:

public Integer insertQueryGetId(String query) {
    Integer numero=0;
    Integer risultato=-1;
    try {
        Statement stmt = db.createStatement();
        numero = stmt.executeUpdate(query);

        ResultSet rs = stmt.getGeneratedKeys();
        if (rs.next()){
            risultato=rs.getInt(1);
        }
        rs.close();

        stmt.close();
    } catch (Exception e) {
        e.printStackTrace();
        errore = e.getMessage();
        risultato=-1;
    }
  return risultato;
}

Фактически, каждый раз risultato = -1, и я получаю java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement().

Как я могу исправить эту проблему? Спасибо Stackoverflow People:)

4b9b3361

Ответ 1

Не могли бы вы просто изменить:

numero = stmt.executeUpdate(query);

в

numero = stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);

Взгляните на документацию для интерфейса JDBC Statement.

Обновить. По-видимому, есть много путаницы в этом ответе, но я предполагаю, что люди, которые смущены, не читают его в контексте заданного вопроса. Если вы возьмете код, предоставленный OP в своем вопросе, и замените одну строку (строка 6), которую я предлагаю, все будет работать. Переменная numero совершенно не имеет значения, и ее значение никогда не читается после ее установки.

Ответ 2

В качестве альтернативы вы можете:

Statement stmt = db.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
numero = stmt.executeUpdate();

ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()){
    risultato=rs.getInt(1);
}

Вместо этого используйте сценарий "Шон Яр" вместо вашего сценария.