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