首页 > 解决方案 > 重置 sqlite 序列自动增量

问题描述

我想在我的表中重置自动增量。我试图这样做,但是当我创建并插入一个新行时,一个 id 不是 1,而是只是 autoincremented 。

@Query("delete from sqlite_sequence where name='approval';")
void delete();


@Query("DELETE FROM approval")
void nukeTable();

如何重置自动增量以再次从 1 开始?

标签: javaandroidandroid-room

解决方案


我不知道 Room 可能会带来什么,但在纯 Sqlite3 级别,删除记录sqlite_sequence并将其值设置为零都可以解决问题,前提是从相关表中删除所有记录。

autoinc.sql3

create table ai ( id integer primary key autoincrement, value ) ;

select 'Normal insertion' ;
insert into ai(value) values ( 1 ), ( 42 ) ;
select * from ai ;

select 'Delete sequence only' ;
delete from sqlite_sequence where name = 'ai' ;
insert into ai(value) values ( 1 ), ( 42 ) ;
select * from ai ;

select 'Delete sequence and data' ;
delete from sqlite_sequence where name = 'ai' ;
delete from ai ;
insert into ai(value) values ( 1 ), ( 42 ) ;
select * from ai ;

运行它sqlite3 < autoinc.sql3会给出以下输出:

Normal insertion
1|1
2|42
Delete sequence only
1|1
2|42
3|1
4|42
Delete sequence and data
1|1
2|42

如果不是从序列表中删除记录,而是使用 将其重置为零,则会获得完全相同的结果update sqlite_sequence set seq=0 where name = 'ai' ;

但是,如上面的结果所示,如果表中有任何记录,则会保留编号(可能是非autoincrement主键使用的最高使用加一)。

可能是在删除/重置序列和从中删除记录之间插入记录approval吗?假设 Room 支持它,请在单个事务中尝试这两种操作。


推荐阅读