如何在sqlite中重置自动增量序列号

Ban*_*zio 8 sqlite android ormlite

如何在Ormlite中更新表sqlite_sequence?我只需要更新seq.如何通过ORMLite获取该表?

编辑

我找不到ORLite工具来做这个,所以我使用简单的sqlite查询.在我的类扩展OrmLiteSqliteOpenHelper我使用SQLiteDatabase进行更新.

EDIT2;)

在我的项目中,我坚持课课和课堂定义.

class Lesson{
    @DatabaseField(generatedId=true)
    private int id;
    ...
}

class WeekDefinitions{
    @DatabaseField(generatedId=true)
    private int id;
    @DatabaseField(foreign=true, columnName="lesson_id")
    private Lesson lesson;
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在,当我添加新课程时,id是递增的.例如

id = 1 Math
id = 2 English
id = 3 Medicine
Run Code Online (Sandbox Code Playgroud)

并在weekDefinition中:

id = 1 lesson_id = 1  nr = 20
id = 2 lesson_id = 1  nr = 22
id = 3 lesson_id = 2  nr = 32
...
id = 12 lesson_id = 3  nr = 3
Run Code Online (Sandbox Code Playgroud)

SQLite将此行添加到sqlite_sequence中(使用autoincrement时)

rowId = 1   name = lesson         seq = 3
rowId = 2   name = weekDefinition seq = 12
Run Code Online (Sandbox Code Playgroud)

现在,我从表Lesson和WeekDefinition中删除所有行.之后Lesson和WeekDef为空,但sqlite_sequence仍然相同.这是问题,因为表课程中的id从值4开始(seq来自sqlite_sequence for lesson并添加1):

id = 4 Math
id = 5 English
id = 6 Medicine
Run Code Online (Sandbox Code Playgroud)

和weekDefinition

id = 13 lesson_id = 1  nr = 20
id = 14 lesson_id = 1  nr = 22
id = 15 lesson_id = 2  nr = 32
Run Code Online (Sandbox Code Playgroud)

对于课程id = 4,Math我应该得到weekDefinitios,但是在weekDefinitions中,lessons_id的值只有1到3而这是我的问题.我需要"重置"sqlite_sequence表(还是有更好的解决方案?)

Tri*_*ped 21

以Marcos Vasconcelos的回答为基础:

UPDATE sqlite_sequence SET seq = (SELECT MAX(col) FROM Tbl) WHERE name="Tbl"
Run Code Online (Sandbox Code Playgroud)

此查询将设置seq为表中col标识列中的最大值Tbl,因此不存在违反约束的风险.


Mar*_*los 9

在.db文件中有一个名为的表 sqlite_sequence

每行有两列 name,表的名称是 seq一个整数,表示此表的当前最后一个值

您可以将其更新为 0

但请注意,您的表是否使用此ID作为唯一标识符.


Huỳ*_*ang 6

UPDATE SQLITE_SEQUENCE SET SEQ= 'value' WHERE NAME='table_name';
Run Code Online (Sandbox Code Playgroud)


Gra*_*ray 1

如果你想在ORMLite中发出通用的数据库命令,你可以使用该updateRaw方法。请参阅javadoc。还有executeRaw其他命令。

lessonDao.updateRaw("delete from 'lesson';");
lessonDao.updateRaw("delete from sqlite_sequence where name='lesson';");
weekDefinitionDao.updateRaw("delete from 'weekdefinition';");
weekDefinitionDao.updateRaw(
    "delete from sqlite_sequence where name='weekdefinition';");
Run Code Online (Sandbox Code Playgroud)

您还可以删除并重新创建该表:

TableUtils.dropTable(WeekDefinition.class);
TableUtils.dropTable(Lesson.class);
TableUtils.createTable(Lesson.class);
TableUtils.createTable(WeekDefinition.class);
Run Code Online (Sandbox Code Playgroud)

我认为真正的问题是为什么您的应用程序依赖于这个数据库内部编号?确实不应该在意。

  • 完全不显示该数字怎么样,这样它可以是 1 或 1001,这样您的应用程序就无关紧要了?
  • 您也可以永远不删除课程,但可以添加一个隐藏的布尔字段。因此,如果重新添加它们,隐藏字段可能会设置为 false,并且Math仍位于 id #1。