我使用SQLite的Xerial最新的JDBC驱动程序(3.7.2版本)它似乎并没有对声明RETURN_GENERATED_KEYS支持。我不断收到在SQLException中“不是SQLite的JDBC驱动程序实现的”。
我真的不想为了得到一个自动递增字段创建的最新标识再拍选择调用(如选择ID从任务ORDER BY 1个递减限制1)。我需要使用该ID来填充另一个表中的字段。
是否有实现这一使用SQLite-JDBC驱动程序的任何更好的方法?
如果升级/更换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.
我还使用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而无需额外的选择。