获取 SQLite 上最后插入行的 ID 的最佳方法

Posted

技术标签:

【中文标题】获取 SQLite 上最后插入行的 ID 的最佳方法【英文标题】:Best way to get the ID of the last inserted row on SQLite 【发布时间】:2011-08-17 13:36:08 【问题描述】:

在 iPhone 上,使用 FMDB 获取 SQLite 数据库中最后插入行的 ID 的最佳方法是什么?

有没有比做更好的方法:

SELECT MAX(ID)

【问题讨论】:

【参考方案1】:

如果您可以保证您的ID 列是自增列,那么MAX(ID) 就可以了。

但为了涵盖任何情况,有一个名为 LAST_INSERT_ROWID() 的专用 SQLite 函数:

SELECT LAST_INSERT_ROWID();

在 FMDB 中,您使用 -lastInsertRowId 方法(在内部运行上述方法):

int lastId = [fmdb lastInsertRowId];

【讨论】:

为什么 [fmdb lastInsertRowId] 总是为我返回 0? @landonandrey lastInsertRowId 在特定连接上工作。您正在使用的连接刚刚打开,因此没有插入行 ID。您可以参考此answer 了解更多信息。 我发现LAST_INSERT_ROWID() 是特定于连接的。因此,如果您打开/关闭连接,它将无法按您预期的方式工作。【参考方案2】:

函数sqlite3_last_insert_rowid() 就是您要找的。刚刚查看了 FMDB 的源代码,FMDatabase 上似乎有一个名为 -lastInsertRowId 的方法包装了该函数。

【讨论】:

@FMDatabase 链接不存在【参考方案3】:

尝试以下方法:

var rowid: Int = Int(contactDB.lastInsertRowId())

【讨论】:

【参考方案4】:

对于 swift 4 使用此代码

let lastRowId = sqlite3_last_insert_rowid(db)

例如

if sqlite3_exec(db, stringSql, nil, nil, nil) != SQLITE_OK 
    let errmsg = String(cString: sqlite3_errmsg(db)!)
    print("error Insert: \(errmsg)")


let lastRowId = sqlite3_last_insert_rowid(db);
print(lastRowId) // its gives you last insert id

if sqlite3_finalize(statement) != SQLITE_OK 
    let errmsg = String(cString: sqlite3_errmsg(db)!)
    print("error finalizing prepared statement: \(errmsg)")

statement = nil

//*** close data base
if sqlite3_close(db) != SQLITE_OK 
    print("error closing database")

db = nil

【讨论】:

以上是关于获取 SQLite 上最后插入行的 ID 的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中使用 SQLite.NET 获取最后一个插入 ID

获取最后插入行的主键 ID 以运行多个插入操作 [重复]

如何使用 Zend_Db 获取 Sqlite 数据库的最后插入 ID

SQLite数据库中获取新插入数据的自增长ID

如何在 SQLite 中获取最后插入的行 guid?

获取 sqldelight 中插入行的行 ID