我正在使用Xerial最新的jdbc驱动程序用于sqlite(版本3.7.2)它似乎不支持Statement RETURN_GENERATED_KEYS。我在SQLException中继续“未通过SQLite JDBC驱动程序实现”。
我真的不想进行另一个选择呼叫(例如,按任务顺序从1个desc限制1中选择id)以获取由自动增量字段创建的最新Id。我需要使用该id来填充另一个表中的字段。
使用sqlite-jdbc驱动程序有没有更好的方法来实现这个目的?
答案 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而没有额外的选择。