2011-12-29 54 views
3

我有一个SQLite DB文件可以说a.db.我在表格a中有100行。当我给甚至在删除行后,SQL Lite空行ID

SELECT * FROM a WHERE rowid BETWEEN 1 AND 100 

它给了我的前100个结果。现在,如果我删除表中的前两行并运行它,它只会给我98行。当我给查询

SELECT * FROM a WHERE rowid = 1 

它给了我一个空行。数据库似乎没有重新排列rowid。

请帮助..有什么办法强制SQLite重新排列行ID?

+0

这是什么意思“空行”? – 2011-12-29 11:11:40

+0

你可以发布截图吗? – 2011-12-29 11:12:12

+0

你为什么把你的问题标记为“mysql”? – Tadeck 2011-12-29 14:58:55

回答

1

在SQLite中,rowid只是一个int列,其值为autoincremented。唯一保证的是每个rowid对该表都是唯一的 - 仅此而已。你不能保证rowid将是连续的,你甚至不能保证每个数字都会被使用!例如,如果INSERT失败,那么在该失败插入中使用的rowid可能会被跳过并且不会再次使用(如果明确使用autoincrement关键字 - 否则,如果删除一行,其rowid可以自由地被任何新插入的数据)。

如果要将rowid设置为顺序并自动完成,则必须创建自己的rowid列版本并使用触发器更新它。

+0

谢谢,但我们需要运行真空来自动修复空行。这比维护自己的row_id容易得多。 – NoobieDude 2012-11-06 07:28:15

+0

@Jeba恐怕这是你唯一的选择。你不能在SQLite中改变'rowid'的行为。也就是说,除非你愿意采用SQLite源代码并修改它来添加该功能。 – ean5533 2012-11-06 16:38:09