我有一个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()
屈服于我的意愿?如果没有,最好的故障安全替代方案是什么?一些可能性:
'SELECT rowid FROM testTable WHERE rowid > prevRowid'
seq(to=lastRowid, length.out=nInserts)
虽然上述两个建议至少应该直观地起作用,但我对sqlite没有足够的信心知道它们是否安全无虞。
答案 0 :(得分:0)
用于生成自动增量ID is documented的算法。
对于INTEGER PRIMARY KEY列,您只需获取当前最大值:
SELECT IFNULL(MAX(x), 0) FROM testTable
然后使用下一个值。