2015-10-14 187 views
2

我有一個SQLite表,其中包含一個「ID」列,它是INTEGER PRIMARY KEY。SQLite:*防止*刪除所有行後重新設置PRIMARY KEY值

當我插入時,該值按預期遞增。

但是,當我刪除所有行時,該列的值將在下一個插入時恢復爲1。

有沒有辦法讓列值從刪除前的最高值繼續增加?

例如:

  • (空表)
  • 插入
  • 插入

(第二行的ID值是2時,下一個插入將是3)

  • 刪除所有行
  • 插入

(此最新的行ID值是1,但我希望它是3)

回答

2

如果AUTOINCREMENT關鍵字出現在INTEGER PRIMARY KEY之後,則會更改自動ROWID分配算法,以防止在數據庫的整個生命週期中重複使用ROWID。換句話說,AUTOINCREMENT的目的是防止重複使用以前刪除的行中的ROWID。

https://www.sqlite.org/autoinc.html

+0

這似乎這樣的伎倆。我在這個頁面的第1項中被「應該避免,如果不是非常需要,通常不需要」。 – dlchambers

0

您正在使用什麼版本的SQLite的?我正在使用SQLite version 3.8.11.1。主鍵值不重置。

創建表並插入一些數據

sqlite> create table test (id integer primary key autoincrement, name varchar(20)); 
sqlite> select * from test; 
sqlite> insert into test (name) values ('hello1'); 
sqlite> insert into test (name) values ('hello2'); 
sqlite> select * from test; 
id   name 
---------- ---------- 
1   hello1 
2   hello2 
sqlite> select * from sqlite_sequence; 
name  seq 
---------- ---------- 
test  2 

autoincrement列,SQLite的保持在sqlite_sequence內部表,你還可以查詢序列的信息。

刪除數據。注意序列保持原樣。

sqlite> delete from test; 
sqlite> select * from sqlite_sequence; 
name  seq 
---------- ---------- 
test  2 
sqlite> select * from test; 
sqlite> insert into test (name) values ('world1'); 
sqlite> insert into test (name) values ('world2'); 
sqlite> select * from test; 
id   name 
---------- ---------- 
3   world1 
4   world2 
sqlite> select * from sqlite_sequence; 
name  seq 
---------- ---------- 
test  4 

基於此,看起來序列號在刪除後保持原樣。我正在使用autoincrement關鍵字。