2014-11-05 46 views
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不夠自信,不知道他們是否是失敗安全的。

回答

0

用於生成自動增量ID的算法is documented

對於INTEGER PRIMARY KEY列,你可以簡單地得到當前最大值:

SELECT IFNULL(MAX(x), 0) FROM testTable 

,然後使用下一個值。