1
我有一個sqlite數據庫,我需要將空間信息和元數據一起插入到R *樹和隨附的常規表中。每個條目需要在數據庫的整個生命週期中唯一地定義。因此常規表有一個INTEGER PRIMARY KEY AUTOINCREMENT列,我的計劃是從插入到這個表中開始,提取最後插入的rowid並將它們用於插入到R *樹中。唉這似乎不可能:從批量插入獲取last_insert_rowid()
>testCon <- dbConnect(RSQLite::SQLite(), ":memory:")
>dbGetQuery(testCon, 'CREATE TABLE testTable (x INTEGER PRIMARY KEY, y INTEGER)')
>dbGetQuery(testCon, 'INSERT INTO testTable (y) VALUES ($y)', bind.data=data.frame(y=1:5))
>dbGetQuery(testCon, 'SELECT last_insert_rowid() FROM testTable')
last_insert_rowid()
1 5
2 5
3 5
4 5
5 5
只有最後插入rowid似乎被保留(可能出於性能原因)。由於要插入的記錄數量是數十萬,因此逐行插入是不可行的。
所以問題是:有什麼辦法讓last_insert_rowid()
彎曲我的意志?如果不是,什麼是最好的故障安全替代方案?一些可能性:
- 記錄插入之前最高的rowid和
'SELECT rowid FROM testTable WHERE rowid > prevRowid'
- 獲取的行數插入,取last_insert_rowid(),並使用
seq(to=lastRowid, length.out=nInserts)
雖然上述兩個建議至少直覺上應該工作我對sqlite不夠自信,不知道他們是否是失敗安全的。