2010-11-28 86 views
3

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

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

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

+0

如果驱动程序不支持它,您需要一个新的驱动程序,另一个数据库或自己编写SELECT。无法保证您提供的示例查询将适用于多位并发用户。 – duffymo 2010-11-28 18:41:26

回答

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. 
+0

您提到的SQLiteJDBC驱动程序是我尝试的第一个。有人建议使用Xerial。无论哪种情况,我都得到了“不支持”。我在MAC上运行JDBC – Amit 2010-11-29 02:52:05

3

我也使用SQLite-JDBC-3.7.2.jar和发现,使用不RETURN_GENERATED_KEYS失败,但是仅仅做随后的结果集=的Statement.getGeneratedKeys()的一个的Statement.execute(SQL); meta = resultset.getMetaData()显示结果集中有一个列名'last_insert_rowid()'。因此,resultset.getInt(“last_insert_rowid()”)的确会返回新插入的rowid而无需额外的选择。

相关问题