删除行后,SQLite空白rowid

时间:2011-12-29 11:06:01

标签: sql sqlite

我有一个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?

2 个答案:

答案 0 :(得分:1)

在SQLite中,rowid只是一个带有autoincremented值的int列。您唯一能保证的是每个rowid对于该表都是唯一的 - 仅此而已。你不能保证rowid是顺序的,你甚至不能保证每个数字都会被使用!例如,如果INSERT失败,则可能会跳过该失败插入中使用的rowid,并且永远不再使用(如果显式使用autoincrement关键字 - 否则,如果删除行,则其rowid可以自由使用被任何新插入的数据重用。)

如果您希望rowid是顺序和自动更新的,则必须创建自己的rowid列版本并使用触发器更新它。

答案 1 :(得分:0)

我找到了答案。我们需要在每次删除后运行Vacuum查询。这将重新排列所有rowindex并删除死行。

http://sqlite.org/lang_vacuum.html