web-dev-qa-db-ja.com

SQLiteで最後に挿入された行のIDを取得するための最良の方法

IPhoneで、FMDBを使用してSQLiteデータベースに最後に挿入された行のIDを取得する最良の方法は何ですか?

行うよりも良い方法はありますか:

SELECT MAX(ID)
26
vdaubry

ID列が自動インクリメント列であることを保証できる場合は、MAX(ID)で問題ありません。

しかし、どんな場合でもカバーするために、 LAST_INSERT_ROWID() と呼ばれる特殊なSQLite関数があります:

SELECT LAST_INSERT_ROWID();

FMDBでは、-lastInsertRowIdメソッド(上記を内部的に実行します)を使用します。

int lastId = [fmdb lastInsertRowId];
61
BoltClock

関数 sqlite3_last_insert_rowid() はあなたが探しているものです。 FMDBのソースコードをチェックアウトしたばかりですが、 FMDatabase-lastInsertRowIdという関数をラップするメソッドがあるようです。

8
JeremyP

次のことを試してください。

var rowid: Int = Int(contactDB.lastInsertRowId())
0
Michele Diblasi

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