java - 重置 sqlite 序列自动增量
问题描述
我想在我的表中重置自动增量。我试图这样做,但是当我创建并插入一个新行时,一个 id 不是 1,而是只是 autoincremented 。
@Query("delete from sqlite_sequence where name='approval';")
void delete();
@Query("DELETE FROM approval")
void nukeTable();
如何重置自动增量以再次从 1 开始?
解决方案
我不知道 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 支持它,请在单个事务中尝试这两种操作。
推荐阅读
- javascript - MailGun 错误:TypeError:无法读取未定义的属性“id”
- zsh - 有没有办法检查选项卡完成菜单是否在 ZSH 中打开
- java - if else 语句返回 else 值,即使它们应该返回 if 值?
- python - pyspark toPandas内部的方法
- mysql - mysql当前时间介于mysql中的两个时间字段之间
- asp.net-core - 如何通过表单将参数传递给操作而不在前端呈现
- javascript - 如何在 yup 中应用条件验证
- javascript - 如何使 vuetify v-btn 元素成为点击事件
- ios - 如何在 SwiftUI 中提供“系统”外观选择?
- python - 熊猫:反向累积和的过程