【问题标题】:After deleting a row in SQLite, _ID of a new entry is not consecutiveSQLite中删除一行后,新条目的_ID不连续
【发布时间】:2012-07-05 14:42:50
【问题描述】:

我使用此方法删除我的 sqlite db 中的一行:

db.execSQL("delete from "+TABLE_NUMS+" where _ID = '" + this.rowID + "'");

然后我更新其余的 ID 以使我的条目连续:

db.execSQL("UPDATE "+TABLE_NUMS+" set _ID = (_ID - 1) WHERE _ID > "+this.rowID);

它工作正常,但是当我向我的数据库添加新条目时,新条目的 ID 仍然添加,就好像已删除的条目存在一样,假设我有 10 行 ID 从 1 到 10,然后我删除数字 5 和 6,行变为 1 到 8,但新条目的 ID 将是 11。所以我的 ID 序列将是 1 到 8 和 11。我该如何解决这个问题?

【问题讨论】:

  • 为什么需要连续的数字?你应该忍受这种行为,这就是它的工作原理。

标签: android sqlite


【解决方案1】:

SQLite 使用特殊的 SQLITE_SEQUENCE 表来跟踪表曾经拥有的最大 ROWID。您可以将该序列修改为:

UPDATE SQLITE_SEQUENCE SET seq = this.ID -1 WHERE name = TABLE_NUMS 

this question 中询问了相同的功能。

【讨论】:

  • 应该不用乱序/自增,这样的建议请慎重!
  • @Nanne 是对的,你必须改变你的逻辑,修改自动增量不是一个好主意。
  • 感谢你们提供的所有信息。那我最好改一下逻辑。
【解决方案2】:

上述正常的ROWID选择算法会生成 只要您从不使用 最大 ROWID 值,并且您永远不会删除表中的条目 最大的 ROWID。如果您曾经删除过行或曾经创建过行 具有最大可能的 ROWID,然后是以前删除的 ROWID 在创建新行和新创建的 ROWID 时可能会重用行 可能不是严格的升序。 http://www.sqlite.org/autoinc.html

这就是 SQLite 的工作原理。

如果您确实需要连续的 ID,请不要使用自动增量。 自己插入ID。 您可以先选择 MAX(_ID) 以获取最后一个 id(最大值)。

【讨论】:

    【解决方案3】:

    这是因为您在创建表时在 _ID 上设置了自动增量。因此,除非您明确设置,否则您添加的每一行都会自动获得一个数字。如果您绝对需要连续顺序的 _ID,我建议您自己设置,而不是使用自动增量。

    重置方法如下:

    delete from your_table;    
    delete from sqlite_sequence where name='your_table';
    

    这将删除您的所有数据并重置序列。

    【讨论】:

    • 在大多数情况下应该没有真正的需要,所以除非有非常明确的原因,否则我不建议手动设置 id。我只是不认为有必要。
    【解决方案4】:

    SQLite 在特殊的 SQLITE_SEQUENCE 表中保留最大的 ROWID。您可以将该表更新为:

    db.execSQL("UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE NAME = '"+TABLE_NAME+"'"); 
    

    将该表删除为:

    db.delete("SQLITE_SEQUENCE","NAME = ?",new String[]{TABLE_NAME});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多