【问题标题】:What's the best way to get the last inserted id using sqlite from Java?使用 Java 中的 sqlite 获取最后插入的 id 的最佳方法是什么?
【发布时间】:2010-09-18 00:33:57
【问题描述】:

使用 Java 中的 sqlite 获取最后插入的 id 的最佳方法是什么?谷歌给了我不同的答案——有人说选择last-insert-rowid;其他人说调用 statement.getGeneratedKeys()。最好的路线是什么? (我只想返回 id,而不是用于其他插入或任何东西。)

【问题讨论】:

    标签: java sqlite jdbc


    【解决方案1】:

    这两种方法都执行完全相同的 SQL 语句,但 java.sql.Statement.getGeneratedKeys() 更易于移植到不同的底层数据库。

    使用sqlite3_last_insert_rowid() C API 函数或last_insert_rowid() SQL 函数是检索上次插入期间生成的rowid 的正确方法。

    SQLite 支持SQL scalar function 语法为:

    SELECT function-name();
    

    因此,如果您无法直接访问 C API,则可以通过 SELECT 语句调用标量函数 last_insert_rowid()

    如果您查看SQLiteJDBC 实现的source code(这是您正在使用的吗?)您会发现这正是该JDBC 包装器的作者所做的:

    ResultSet getGeneratedKeys() throws SQLException {
        if (getGeneratedKeys == null) getGeneratedKeys = conn.prepareStatement(
            "select last_insert_rowid();");
        return getGeneratedKeys.executeQuery();
    }
    

    【讨论】:

      【解决方案2】:

      如果您的 JDBC 驱动程序支持,请使用 getGeneratedKeys()。您不想在插入后自己尝试获取密钥。如果您的驱动程序不支持getGeneratedKeys(),那么我会在插入之前从键中获取下一个值。

      【讨论】:

      • “插入前键的下一个值”比“插入后的最大值”有什么好处?两者都具有相同类型的竞争条件,并且都依赖于键的单调、单一增量。
      • 假设在插入之前检索到的键不是基于对目标表的任何查询,而是来自某个键提供者。在 Oracle 术语中,它将是 Select sequence_name.nextval from dual。我不知道 SQL lite 的详细信息,但一些 api 调用在其自己的自主事务中返回一个完全独立于插入的键。也就是说……使用 getGeneratedKeys()。
      • 行 = stmt.getGeneratedKeys().getInt(1);
      • 你不知道下一个发出的密钥会比当前的最大密钥大一;从那时起,序列可能会继续前进(例如,因为删除的行)。您想获得 DB 发出的密钥,不管它是什么,并让它完成所有关于保持事物唯一性的担忧。这是其工作的一部分。
      猜你喜欢
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多