2012-07-05 32 views
3

我用这个方法在我的SQLite数据库删除行:SQLite中删除行后,新条目的_ID是不连续的

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.我该如何解决这个问题?

+0

为什么你需要连续的数字?你应该忍受这种行为,这是它的工作原理。 – biziclop 2012-07-05 14:46:14

回答

1

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

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

this question中提出了相同的功能。

+3

应该没有必要弄乱顺序/自动增量,请注意这样的建议! – Nanne 2012-07-05 14:50:15

+0

@南妮是对的,你必须改变你的逻辑,修改自动增量不是一个好主意。 – 2012-07-05 14:55:30

+0

谢谢你们所有的信息。那么我最好改变逻辑。 – Wise 2012-07-05 15:24:19

1

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

下面是如何重置:

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

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

+0

在大多数情况下,应该没有实际需要,所以除非有确切的理由,否则我不会建议手动设置ID。我只是没有看到需要。 – Nanne 2012-07-05 14:49:37

2

上述只要你不使用 最大ROWID值,你永远不与 最大的ROWID删除表中的条目将产生 单调递增独特的ROWID正常ROWID选择算法。如果你删除行或如果你创建一个行 以最大可能的ROWID,然后从以前的ROWID删除 行可能创造新行和新创建的ROWID 时,可能不会在严格升序被重用。 http://www.sqlite.org/autoinc.html

这是SQLite的工作原理。

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

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});