我有一个SQLite DB文件让我们说a.db.我在表格中有100行。当我给出
SELECT * FROM a WHERE rowid BETWEEN 1 AND 100
它给了我前100个结果。现在,如果我从表中删除前两行并运行
SELECT * FROM a WHERE rowid BETWEEN 1 AND 100
它只给我98行。当我提出查询时
SELECT * FROM a WHERE rowid = 1
它给了我一个空行。数据库似乎没有重新排列rowid。
请帮助..有没有办法强制SQLite重新排列行ID?
答案 0 :(得分:1)
在SQLite中,rowid
只是一个带有autoincremented值的int列。您唯一能保证的是每个rowid对于该表都是唯一的 - 仅此而已。你不能保证rowid是顺序的,你甚至不能保证每个数字都会被使用!例如,如果INSERT失败,则可能会跳过该失败插入中使用的rowid,并且永远不再使用(如果显式使用autoincrement
关键字 - 否则,如果删除行,则其rowid可以自由使用被任何新插入的数据重用。)
如果您希望rowid是顺序和自动更新的,则必须创建自己的rowid列版本并使用触发器更新它。
答案 1 :(得分:0)
我找到了答案。我们需要在每次删除后运行Vacuum查询。这将重新排列所有rowindex并删除死行。