Sqlite JDBC driver not supporting RETURN_GENERATED_KEYS

前端 未结 2 2003
南笙
南笙 2021-01-05 18:51

I am using Xerial latest jdbc driver for sqlite (version 3.7.2) It does not seem to have support for Statement RETURN_GENERATED_KEYS. I keep getting \"not implemented by SQL

相关标签:
2条回答
  • 2021-01-05 19:32

    I'm also using sqlite-jdbc-3.7.2.jar and found that using RETURN_GENERATED_KEYS does fail, however merely doing a statement.execute(sql) followed by resultset = statement.getGeneratedKeys() and meta = resultset.getMetaData() shows that a column name last_insert_rowid() is available in the resultset. So resultset.getInt("last_insert_rowid()") does indeed return the newly inserted rowid without an additional select.

    0 讨论(0)
  • 2021-01-05 19:38

    If upgrading/replacing the JDBC driver is not an option (the SQLiteJDBC seem to support it), then you really need to fire a SELECT last_insert_rowid() query to obtain the generated key. To avoid race conditions with concurrent inserts, fire it in a transaction.

    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.
    
    0 讨论(0)
提交回复
热议问题