【问题标题】:How can I reset a autoincrement sequence number in sqlite如何在 sqlite 中重置自动增量序列号
【发布时间】:2011-04-07 19:08:03
【问题描述】:

如何在 Ormlite 中更新表 sqlite_sequence ?我只需要更新序列。如何通过 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;
    ...
}

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

id = 1 Math
id = 2 English
id = 3 Medicine

并且在 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

SQLite 将此行添加到 sqlite_sequence(使用自动增量时)

rowId = 1   name = lesson         seq = 3
rowId = 2   name = weekDefinition seq = 12

现在,我从表 Lesson 和 WeekDefinition 中删除所有行。之后 Lesson 和 WeekDef 都是空的,但是 sqlite_sequence 还是一样的。这是问题,因为表课程中的 id 从值 4 开始(课程中 sqlite_sequence 的 seq 并添加 1):

id = 4 Math
id = 5 English
id = 6 Medicine

和星期定义

id = 13 lesson_id = 1  nr = 20
id = 14 lesson_id = 1  nr = 22
id = 15 lesson_id = 2  nr = 32

对于课程 id = 4 ,数学我应该得到 weekDefinitios,但在 weekDefinitions 中,课程 ID 的值只有 1 到 3 这是我的问题。我需要“重置” sqlite_sequence 表(或者有更好的解决方案?)

【问题讨论】:

  • 能否请您重新表述您的问题并提供更多详细信息 Bandzio。我不知道你在这里问什么。什么是“sqlite_sequence”?您是否仅尝试从数据库中的表中获取序列号?所以你坚持only的对象有一个生成的id?
  • Bandzio,你真的应该接受其中一个答案;两者都很好,已经使用了 6 个月以上

标签: android sqlite ormlite


【解决方案1】:

以 Marcos Vasconcelos 的 answer 为基础:

UPDATE sqlite_sequence SET seq = (SELECT MAX(col) FROM Tbl) WHERE name="Tbl"

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

【讨论】:

  • 谢谢这正是我要找的东西
  • @byteC0de 您是否将 col 替换为要更新的列名,将 Tbl 替换为要更新的表名?
【解决方案2】:

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

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

您可以将其更新为0

但请注意,如果您的表使用此 id 作为唯一标识符。

【讨论】:

    【解决方案3】:
    UPDATE SQLITE_SEQUENCE SET SEQ= 'value' WHERE NAME='table_name';
    

    【讨论】:

      【解决方案4】:

      如果你想在 ORMLite 中发出通用的数据库命令,你可以使用updateRaw 方法。请参阅javadocs。其他命令还有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';");
      

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

      TableUtils.dropTable(WeekDefinition.class);
      TableUtils.dropTable(Lesson.class);
      TableUtils.createTable(Lesson.class);
      TableUtils.createTable(WeekDefinition.class);
      

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

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

      【讨论】:

        【解决方案5】:

        这在我的数据库中对我有用:(我在一个之前设置 id,然后在删除一行后,当我再次添加新数据行时,自动递增序列保持正常):

         public void  updateSerialNumber ( long memberId){
                String query = "UPDATE SQLITE_SEQUENCE SET SEQ= '"+(memberId-1)+"' WHERE NAME='"+ReportBigHelper.TABLE_MEMBER+"'";
                database.execSQL(query);
            }
        

        【讨论】:

          猜你喜欢
          • 2014-01-17
          • 1970-01-01
          • 1970-01-01
          • 2011-03-08
          • 1970-01-01
          • 2019-05-11
          • 2013-05-24
          • 2011-08-01
          • 2011-11-13
          相关资源
          最近更新 更多