【问题标题】:Sqlite JDBC driver not supporting RETURN_GENERATED_KEYSSqlite JDBC 驱动程序不支持 RETURN_GENERATED_KEYS
【发布时间】:2011-05-16 22:42:28
【问题描述】:

我正在为 sqlite 使用 Xerial 最新的 jdbc 驱动程序(版本 3.7.2)它似乎不支持 Statement RETURN_GENERATED_KEYS。我在 SQLException 中不断收到“未由 SQLite JDBC 驱动程序实现”。

我真的不想再进行一次 select 调用(例如 select id from tasks order by 1 desc limit 1 )以获得由自动增量字段创建的最新 Id。我需要使用该 id 来填充另一个表中的字段。

有没有更好的方法使用 sqlite-jdbc 驱动来实现这一点?

【问题讨论】:

  • 如果驱动程序不支持它,你要么需要一个新的驱动程序,另一个数据库,要么自己编写 SELECT。无法保证您提供的示例查询将同时适用于多个用户。

标签: sqlite jdbc


【解决方案1】:

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

【讨论】:

  • 您提到的 SQLiteJDBC 驱动程序是我尝试的第一个驱动程序。有人建议改用 Xerial。无论哪种情况,我都得到“不支持”。我在 MAC 上运行 JDBC
  • 您提到的 JDBC 驱动程序没有实现获取生成的密钥所需的 JDBC 方法...
【解决方案2】:

我也在使用 sqlite-jdbc-3.7.2.jar 并发现使用 RETURN_GENERATED_KEYS 确实失败了,但是仅执行 statement.execute(sql) 后跟 resultset = statement.getGeneratedKeys()meta = resultset.getMetaData() 显示列名 @987654325 @ 在结果集中可用。所以resultset.getInt("last_insert_rowid()") 确实返回了新插入的rowid 而没有额外的选择。

【讨论】:

    猜你喜欢
    • 2012-11-26
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 2011-03-15
    • 2017-10-24
    • 1970-01-01
    相关资源
    最近更新 更多