Какой лучший способ получить последний вставленный идентификатор с помощью sqlite из Java?

Какой лучший способ получить последний вставленный идентификатор с помощью sqlite из Java? Google дает мне разные ответы - некоторые говорят, выберите last-insert-rowid; другие говорят call statement.getGeneratedKeys (). Какой лучший маршрут? (Я просто хочу вернуть идентификатор, а не использовать его для других вставок или чего-то еще.)

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
13
0
22 105
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте getGeneratedKeys(), если ваш драйвер JDBC его поддерживает. Не стоит возиться, пытаясь достать ключ самостоятельно после вставки. Если ваш драйвер не поддерживает getGeneratedKeys(), я бы получил следующее значение из ключа перед вставкой.

Чем «следующее значение ключа перед вставкой» лучше, чем «наибольшее значение после вставки»? Оба имеют одинаковый тип состояния гонки, и оба полагаются на монотонное единичное приращение ключа.

lmat - Reinstate Monica 19.03.2013 18:54

Предполагается, что ключ, полученный перед вставкой, будет основан не на каком-либо запросе целевой таблицы, а от некоторого поставщика ключей. В терминах Oracle это будет Select sequence_name.nextval from dual. Я не знаю подробностей для SQL lite, но некий вызов API, который возвращает ключ в своей собственной автономной транзакции, полностью независимой от вставки. Тем не менее ... используйте getGeneratedKeys ().

Brian 19.03.2013 22:48

row = stmt.getGeneratedKeys (). getInt (1);

Martin Pfeffer 04.04.2015 19:06

Любой подход выполняет один и тот же точный оператор SQL, но java.sql.Statement.getGeneratedKeys() более переносим для различных базовых баз данных.

Использование функции API sqlite3_last_insert_rowid() C или функции last_insert_rowid() SQL - правильный способ получить идентификатор строки, сгенерированный во время последней вставки.

SQLite поддерживает синтаксис Скалярная функция SQL как:

SELECT function-name();

Следовательно, если у вас нет прямого доступа к C API, вы можете вызвать скалярную функцию last_insert_rowid() с помощью оператора SELECT.

Если вы посмотрите на исходный код для реализации SQLiteJDBC (это то, что вы используете?), Вы увидите, что это именно то, что сделал автор этой оболочки JDBC:

ResultSet getGeneratedKeys() throws SQLException {
    if (getGeneratedKeys == null) getGeneratedKeys = conn.prepareStatement(
        "select last_insert_rowid();");
    return getGeneratedKeys.executeQuery();
}

Другие вопросы по теме