SQL (Java, h2): как лучше всего получить уникальный идентификатор единственного элемента, который я только что вставил в свою базу данных?

Мой текущий метод таков:

SELECT TOP 1 ID FROM DATAENTRY ORDER BY ID DESC

Предполагается, что последний вставленный элемент всегда имеет наивысший уникальный идентификатор (первичный ключ, автоинкремент). Здесь что-то не так.

Альтернативы?


person Daddy Warbox    schedule 15.04.2010    source источник
comment
К вашему сведению, почти повторяющийся вопрос: Есть ли способ получить идентификатор автоинкремента из подготовленного оператора   -  person Basil Bourque    schedule 17.07.2015


Ответы (2)


Если драйвер JDBC поддерживает это, вы также можете просто использовать _ 1_ за это.

String sql = "INSERT INTO tbl (col) VALUES (?)";
preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
preparedStatement.setString(1, col);
preparedStatement.executeUpdate();
generatedKeys = preparedStatement.getGeneratedKeys();
if (generatedKeys.next()) {
    long id = generatedKeys.getLong(1);
} else {
    // Throw exception?
}
person BalusC    schedule 15.04.2010
comment
По моему опыту и знаниям, все текущие версии драйверов JDBC для основных серверов СУБД, таких как MySQL, MSSQL, PostgreSQL, Oracle и DB2, поддерживают его (Oracle и PostgreSQL потребовали некоторое время, примерно год назад они не поддерживали его. ). К сожалению, у меня нет опыта работы с H2, поэтому я не могу сказать сразу, но беглый взгляд на Google показывает, что он его поддерживает. - person BalusC; 15.04.2010
comment
Ладно, отлично работает! Но разве это лучше, чем IDENTITY ()? - person Daddy Warbox; 15.04.2010
comment
Он делает IDENTITY() под капотами, но теперь более абстрактным и независимым от БД способом с использованием чистого JDBC API. У вас будет меньше головной боли при обслуживании, когда вы захотите переключить базу данных. Если вы все сделали правильно и стандартным способом, то все, что вам нужно сделать, это заменить драйвер JDBC и URL / логин. Вы можете сохранить кодировку без изменений. - person BalusC; 15.04.2010
comment
быстрое замечание, что это работает только в h2 для последнего сгенерированного ключа в случае, когда оператор вставки вставил несколько записей. Таким образом, h2 лишь частично поддерживает getGeneratedKeys (). - person Dave Moten; 07.06.2015

Если вы используете MySQL, вы можете сделать

select last_insert_id();

При использовании MS SQL

select scope_identity();

Что касается H2, я считаю, что это

CALL SCOPE_IDENTITY();

но у меня нет опыта работы с этой БД

person Sean    schedule 15.04.2010
comment
Хм. Интересно, есть ли эквивалент H2 ... - person Daddy Warbox; 15.04.2010
comment
Извините, изначально не видел тег h2. Обновил свой ответ тем, что я считаю эквивалентом. - person Sean; 15.04.2010
comment
Я буду вставлять экземпляры PreparedStatement в Java, поэтому вместо этого мне может понадобиться IDENTITY (). Но да, это должно сработать. Спасибо. - person Daddy Warbox; 15.04.2010
comment
SCOPE_IDENTITY() H2 не будет работать должным образом. См. groups.google.com/d/msg/h2-database/0xJsP993RHY / 0LERpBvtLNUJ - person Gili; 05.09.2014
comment
@Gili IMHO обычно работает так, как ожидалось, потому что все, что вам нужно, это использовать SELECT SCOPE_IDENTITY(); вместо SET. Это все. - person G. Demecki; 08.03.2016
comment
H2 ВЫБЕРИТЕ SCOPE_IDENTITY () как LAST_ID; затем resultSet.getInt (LAST_ID); - person Vahe Gharibyan; 11.05.2017