使用Java中的sqlite获取最后插入的id的最佳方法是什么?

使用Java中的sqlite获取最后插入的id的最佳方法是什么?,java,sqlite,jdbc,Java,Sqlite,Jdbc,使用Java中的sqlite获取最后插入的id的最佳方法是什么?谷歌给了我不同的答案,有人说选择最后一个插入rowid;其他人说call statement.getGeneratedKeys。最好的路线是什么?我只想返回id,而不是将其用于其他插入或任何操作。如果JDBC驱动程序支持,请使用getGeneratedKeys。你可不想在插入后自己动手去拿钥匙。如果您的驱动程序不支持getGeneratedKeys,那么我将在插入之前从该键获取下一个值。这两种方法都执行相同的SQL语句,但更适合于不

使用Java中的sqlite获取最后插入的id的最佳方法是什么?谷歌给了我不同的答案,有人说选择最后一个插入rowid;其他人说call statement.getGeneratedKeys。最好的路线是什么?我只想返回id,而不是将其用于其他插入或任何操作。

如果JDBC驱动程序支持,请使用getGeneratedKeys。你可不想在插入后自己动手去拿钥匙。如果您的驱动程序不支持getGeneratedKeys,那么我将在插入之前从该键获取下一个值。

这两种方法都执行相同的SQL语句,但更适合于不同的基础数据库

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

SQLite支持以下语法:

SELECT function-name();
因此,如果不能直接访问C API,可以通过SELECT语句调用标量函数last_insert_rowid

如果你看一下实现的方法,这就是你正在使用的吗?您将看到,这正是JDBC包装器的作者所做的:

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

插入前键的下一个值以何种方式优于插入后的最大值?两者都具有相同类型的竞争条件,并且都依赖于单调、单一的密钥增量。假设在插入之前检索到的密钥不会基于目标表的任何查询,而是来自某个密钥提供程序。在Oracle术语中,它将是从dual中选择sequence_name.nextval。我不知道SQLLite的细节,但是一些api调用在它自己的自治事务中返回一个键,完全独立于插入。也就是说…使用getGeneratedKeys.row=stmt.getGeneratedKeys.getInt1;您不知道下一个发出的密钥将比当前最大密钥大一个;从那时起,序列可能已经移动,例如,因为删除了行。您希望获得DB发布的密钥,不管是什么,并让它做所有关于保持事物唯一性的担心。这是它工作的一部分。