1

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

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

4

1 回答 1

0

生成自动递增 ID 的算法已记录在案

对于 INTEGER PRIMARY KEY 列,您可以简单地获取当前最大值:

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

然后使用下一个值。

于 2014-11-05T14:06:47.350 回答