Драйвер Sqlite JDBC не поддерживает RETURN_GENERATED_KEYS - PullRequest
3 голосов
/ 28 ноября 2010

Я использую последний драйвер Xerial jdbc для sqlite (версия 3.7.2). Кажется, он не поддерживает оператор RETURN_GENERATED_KEYS. Я продолжаю получать сообщение «Не реализовано драйвером SQLite JDBC» в исключении SQLException.

Я действительно не хочу делать еще один вызов select (например, выбрать id из порядка задач на 1 деск предел 1), чтобы получить последний Id, созданный полем автоинкремента. Мне нужно использовать этот идентификатор для заполнения поля в другой таблице.

Есть ли лучшие способы добиться этого с помощью драйвера sqlite-jdbc?

Ответы [ 2 ]

8 голосов
/ 28 ноября 2010

Если обновление / замена драйвера JDBC не является опцией ( SQLiteJDBC , похоже, его поддерживает), то вам действительно нужно запустить запрос SELECT last_insert_rowid(), чтобы получить сгенерированный ключ. Чтобы избежать условий гонки с одновременными вставками, запустите его в транзакции.

connection = database.getConnection();
connection.setAutoCommit(false); // Starts transaction.
preparedStatement = connection.prepareStatement(INSERT_SQL);
preparedStatement.setSomething(something);
// ...
preparedStatement.executeUpdate();
statement = connection.createStatement();
generatedKeys = statement.executeQuery("SELECT last_insert_rowid()");
if (generatedKeys.next()) {
    generatedKey = generatedKeys.getLong(1);
}
connection.commit(); // Commits transaction.
4 голосов
/ 09 сентября 2011

Я также использую sqlite-jdbc-3.7.2.jar и обнаружил, что использование RETURN_GENERATED_KEYS не удается, однако простое выполнение statement.execute(sql) с последующими resultset = statement.getGeneratedKeys() и meta = resultset.getMetaData() показывает, что имя столбца last_insert_rowid() доступно в наборе результатов.Таким образом, resultset.getInt("last_insert_rowid()") действительно возвращает вновь вставленный rowid без дополнительного выбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...