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

vda*_*bry 25 sql sqlite objective-c fmdb ios

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

有没有更好的方式而不是做:

SELECT MAX(ID)
Run Code Online (Sandbox Code Playgroud)

Bol*_*ock 61

如果您可以保证您的ID列是自动增量列,那MAX(ID)很好.

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

SELECT LAST_INSERT_ROWID();
Run Code Online (Sandbox Code Playgroud)

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

int lastId = [fmdb lastInsertRowId];
Run Code Online (Sandbox Code Playgroud)

  • @landonandrey `lastInsertRowId` 适用于特定连接。您正在使用的连接刚刚打开,因此没有插入的行 ID。您可以参考此[答案](/sf/ask/908366931/)了解更多信息。 (2认同)

Jer*_*myP 8

函数sqlite3_last_insert_rowid()就是你要找的.刚刚检查了FMDB的源代码,似乎有一个调用FMDatabase的方法-lastInsertRowId来包装该函数.


Bij*_*wat 5

对于 swift 5 使用此代码

let lastRowId = sqlite3_last_insert_rowid(db)
Run Code Online (Sandbox Code Playgroud)

例如

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
Run Code Online (Sandbox Code Playgroud)