2012-07-05 56 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});