获取 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? @landonandreylastInsertRowId
在特定连接上工作。您正在使用的连接刚刚打开,因此没有插入行 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