Sqlite JDBC驱动程序不支持RETURN_GENERATED_KEYS

时间:2010-11-28 18:34:20

标签: sqlite jdbc

我正在使用Xerial最新的jdbc驱动程序用于sqlite(版本3.7.2)它似乎不支持Statement RETURN_GENERATED_KEYS。我在SQLException中继续“未通过SQLite JDBC驱动程序实现”。

我真的不想进行另一个选择呼叫(例如,按任务顺序从1个desc限制1中选择id)以获取由自动增量字段创建的最新Id。我需要使用该id来填充另一个表中的字段。

使用sqlite-jdbc驱动程序有没有更好的方法来实现这个目的?

2 个答案:

答案 0 :(得分:8)

如果升级/替换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.

答案 1 :(得分:4)

我也在使用sqlite-jdbc-3.7.2.jar,发现使用RETURN_GENERATED_KEYS确实失败了,只是做statement.execute(sql)后跟resultset = statement.getGeneratedKeys()和{{1} }表示结果集中的列名meta = resultset.getMetaData()可用。所以last_insert_rowid()确实返回了新插入的rowid而没有额外的选择。