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

29

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

除了执行以下操作外,是否有更好的方法:

SELECT MAX(ID)
4个回答

66

如果你可以保证你的ID列是自动递增的,那么使用MAX(ID)就可以了。

但为了覆盖任何情况,SQLite有一个专门的函数叫做LAST_INSERT_ROWID()

SELECT LAST_INSERT_ROWID();

在FMDB中,你可以使用-lastInsertRowId方法(内部运行上述代码):

int lastId = [fmdb lastInsertRowId];

为什么 [fmdb lastInsertRowId] 对我总是返回0? - landonandrey
2
@landonandrey lastInsertRowId 只在特定的连接上起作用。你正在使用的连接刚刚被打开,因此没有插入行 ID。你可以参考这个答案获取更多信息。 - Bernard
1
我发现LAST_INSERT_ROWID()是与连接相关的。因此,如果您正在打开/关闭连接,则它不会按照您的预期工作。 - Elijah W. Gagne

9

@FMDatabase链接不存在。 - Krutarth Patel

5

对于Swift 5,请使用以下代码

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

1
请尝试以下操作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接