SQLite:*在删除所有行后阻止* PRIMARY KEY值重置

时间:2015-10-14 20:49:42

标签: sqlite auto-increment

我有一个SQLite表,有几列,包括一个“ID”列,它是INTEGER PRIMARY KEY。

插入时,此值会按预期递增。

但是,当我删除所有行时,此列的值在下一次插入时将恢复为1.

有没有办法让列值从删除前的最高值继续增加?

例如:

  • (空表)
  • 插入
  • 插入

(第2行的ID值为2,下次插入为3)

  • 删除所有行
  • 插入

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

2 个答案:

答案 0 :(得分:3)

如果AUTOINCREMENT关键字出现在INTEGER PRIMARY KEY之后,则会更改自动ROWID分配算法,以防止在数据库的生命周期内重用ROWID。换句话说,AUTOINCREMENT的目的是防止从以前删除的行重用ROWID。

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

答案 1 :(得分: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关键字。