删除SQLite中的行后,新条目的_ID不连续

时间:2012-07-05 14:42:50

标签: android sqlite

我使用此方法删除sqlite db中的行:

db.execSQL("delete from "+TABLE_NUMS+" where _ID = '" + this.rowID + "'");

然后我更新其余的ID以使我的条目连续:

db.execSQL("UPDATE "+TABLE_NUMS+" set _ID = (_ID - 1) WHERE _ID > "+this.rowID);

它工作正常,但是当我向我的数据库中添加新条目时,新条目的ID仍然会添加,就好像已删除的条目一样,比如我有10行,ID从1到10开始,然后我删除数字5和6,行变为1到8,但新条目的ID将是11.所以我的ID序列将是1到8和11.我该如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

  

将生成上述正常的ROWID选择算法   只要你从不使用,就单调增加独特的ROWID   最大ROWID值,您永远不会删除表中的条目   最大的ROWID。如果您删除了行或者您曾创建过行   使用最大可能的ROWID,然后从之前删除的ROWID   创建新行和新创建的ROWID时可能会重用行   可能不是严格按升序排列。   http://www.sqlite.org/autoinc.html

这就是SQLite的工作方式。

如果你真的需要连续使用Ids,请不要使用自动增量。 自己插入ID。 您可以先选择MAX(_ID)以获取最后一个ID(最大值)。

答案 1 :(得分:1)

这是因为您在创建表时在_ID上设置了自动增量。因此,除非您明确设置,否则您添加的每一行都将自动给出一个数字。如果绝对需要连续订购_ID,我建议您自己设置,而不是使用自动增量。

以下是重置方法:

delete from your_table;    
delete from sqlite_sequence where name='your_table';

这将删除所有数据并重置序列。

答案 2 :(得分:1)

SQLite使用特殊的SQLITE_SEQUENCE表跟踪表所拥有的最大ROWID。您可以将该序列修改为:

UPDATE SQLITE_SEQUENCE SET seq = this.ID -1 WHERE name = TABLE_NUMS 

this question中询问相同的功能。

答案 3 :(得分:0)

SQLite在特殊的SQLITE_SEQUENCE表中保留最大的ROWID。您可以将该表更新为:

db.execSQL("UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE NAME = '"+TABLE_NAME+"'"); 

OR

将该表删除为:

db.delete("SQLITE_SEQUENCE","NAME = ?",new String[]{TABLE_NAME});