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




Используйте getGeneratedKeys(), если ваш драйвер JDBC его поддерживает. Не стоит возиться, пытаясь достать ключ самостоятельно после вставки. Если ваш драйвер не поддерживает getGeneratedKeys(), я бы получил следующее значение из ключа перед вставкой.
Предполагается, что ключ, полученный перед вставкой, будет основан не на каком-либо запросе целевой таблицы, а от некоторого поставщика ключей. В терминах Oracle это будет Select sequence_name.nextval from dual. Я не знаю подробностей для SQL lite, но некий вызов API, который возвращает ключ в своей собственной автономной транзакции, полностью независимой от вставки. Тем не менее ... используйте getGeneratedKeys ().
row = stmt.getGeneratedKeys (). getInt (1);
Любой подход выполняет один и тот же точный оператор 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();
}
Чем «следующее значение ключа перед вставкой» лучше, чем «наибольшее значение после вставки»? Оба имеют одинаковый тип состояния гонки, и оба полагаются на монотонное единичное приращение ключа.