SQLite:*防止* PRIMARY KEY 值在删除所有行后重置 [重复]
Posted
技术标签:
【中文标题】SQLite:*防止* PRIMARY KEY 值在删除所有行后重置 [重复]【英文标题】:SQLite: *prevent* PRIMARY KEY value from resetting after delete all rows [duplicate] 【发布时间】:2016-01-13 03:09:20 【问题描述】:我有一个 SQLite 表,有几列,包括一个“ID”列,它是 INTEGER PRIMARY KEY。
当我插入时,这个值会按预期递增。
但是,当我删除所有行时,该列的值会在下一次插入时恢复为 1。
有没有办法让列值从删除前的最大值继续递增?
例如:
(空表) 插入 插入(第 2 行的 ID 值为 2,下一个插入为 3)
删除所有行 插入(最新行的 ID 值为 1,但我希望它为 3)
【问题讨论】:
【参考方案1】:如果 AUTOINCREMENT 关键字出现在 INTEGER PRIMARY KEY 之后,则会更改自动 ROWID 分配算法,以防止在数据库的生命周期内重复使用 ROWID。换句话说,AUTOINCREMENT 的目的是防止重复使用以前删除的行中的 ROWID。
https://www.sqlite.org/autoinc.html
【讨论】:
这似乎可以解决问题。我被该页面第 1 项上的“如果不是严格需要,应该避免。通常不需要”所推迟。【参考方案2】:您使用的是什么版本的 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
关键字。
【讨论】:
以上是关于SQLite:*防止* PRIMARY KEY 值在删除所有行后重置 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Microsoft.Data.Sqlite.SqliteException SQLite 错误 1:'AUTOINCREMENT 只允许在 INTEGER PRIMARY KEY 上使用'
MySQL中Key、Primary Key、Unique Key和Index的区别
是否可以为每个数据库禁用“sql_require_primary_key”?