比方说a.db,我有一个SQLite DB文件。表a中有100行。当我给出
SELECT * FROM a WHERE rowid BETWEEN 1 AND 100它给出了前100个结果。现在,如果我从表中删除前2行,并运行
SELECT * FROM a WHERE rowid BETWEEN 1 AND 100 它只给了我98行。当我给出查询的时候
SELECT * FROM a WHERE rowid = 1 它给了我一个空行。数据库似乎没有重新排列rowid。
请帮帮我..有没有办法强制SQLite重新排列行ids?
发布于 2011-12-29 22:50:03
在SQLite中,rowid只是一个包含autoincremented值的整型列。唯一可以保证的是,每个rowid对于该表都是唯一的--仅此而已。你不能保证rowids是连续的,你甚至不能保证每个数字都会被使用!例如,如果插入失败,在失败的插入中使用的行ID可能会被跳过,并且永远不会再使用(如果显式使用了autoincrement关键字--否则,如果删除了一行,则任何新插入的数据都可以自由地重用它的行ID)。
如果您希望rowid是连续的和自动更新的,则必须创建您自己的rowid列版本,并使用触发器对其进行更新。
发布于 2012-11-06 15:26:53
我找到了答案。我们需要在每次删除后运行Vacuum查询。这将重新排列所有的rowindex并删除死行。
https://stackoverflow.com/questions/8667077
复制相似问题