【问题标题】:SQLite database ..is the value of primary key effected if i delete a row from tableSQLite 数据库..如果我从表中删除一行,主键的值会受到影响
【发布时间】:2012-02-27 18:13:48
【问题描述】:

假设我最初建立一个有 10 行的表。所以最后的 id(主键列)的值是 9 还是 10 ?现在假设我删除行号。 5 和 8(假设行数从 1 开始)然后再添加一行,这样现在我总共有 9 行。现在每一行中 id 的值会发生什么变化?

      db.delete(DBAdapter.TableName, "Id=? AND QstnrId=? AND QstnId=?",
      new String[] { Id.toString(), QuestionnaireId, QuestionId });

【问题讨论】:

  • 试一试有什么问题?
  • 如果这是您的要求,则不会重新分配 ID...row id 10 仍然是 10。

标签: java android sql database sqlite


【解决方案1】:

之前行的 id 值将保持不变...

对于新的,将从 10/11 开始...

所以 ID 列表将是:1 2 3 4 6 7 9 10 11 12 ,.... as in every other SQL Database

【讨论】:

    【解决方案2】:

    SQLite 中的自动增量主键列使用的值比表中曾经使用过的最大值大 1:

    来自the documentation

    如果列的类型为 INTEGER PRIMARY KEY AUTOINCREMENT,则使用稍微不同的 ROWID 选择算法。 为新行选择的 ROWID 至少比同一个表中曾经存在过的最大 ROWID 大一个。 如果该表以前从未包含任何数据,则使用 1 的 ROWID .如果该表之前保存了可能具有最大 ROWID 的行,则不允许新的 INSERT,并且任何插入新行的尝试都将失败并出现 SQLITE_FULL 错误。

    因此,删除一行对生成的下一个 ID 没有影响。

    注意:在非主键的情况下,只使用当前最大ID的值。

    另外,删除一行不会改变另一行的值,所以如果你有 ID 为 1、2、3、4 并删除 ID 为 1 的行,剩下的行仍然有 ID 2、3、4。自动增量只是一种使插入更容易的方法。

    【讨论】:

    • 非常感谢...特别是文档...:)
    【解决方案3】:

    旧的 ID 值不会受到影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      相关资源
      最近更新 更多