从批量插入中获取last_insert_rowid()

时间:2014-11-05 09:29:40

标签: r sqlite rsqlite

我有一个sqlite数据库,我需要将空间信息和元数据一起插入到R *树和附带的常规表中。每个条目都需要在数据库的生命周期内唯一定义。因此,常规表有一个INTEGER PRIMARY KEY AUTOINCREMENT列,我的计划是从插入到此表开始,提取最后插入的rowid并使用这些插入到R *树中。唉,这似乎不可能:

>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没有足够的信心知道它们是否安全无虞。

1 个答案:

答案 0 :(得分:0)

用于生成自动增量ID is documented的算法。

对于INTEGER PRIMARY KEY列,您只需获取当前最大值:

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

然后使用下一个值。