【问题标题】:The ids of a table in my sqlite database have been reset我的 sqlite 数据库中的表的 id 已被重置
【发布时间】:2010-09-02 14:31:05
【问题描述】:

我有一个 iPhone 应用程序,我的一个用户发现我的应用程序存在一个非常奇怪的问题。我无法重现该问题,也无法弄清楚它为什么会发生。也许你可以?

在 Sqlite 中,我有一个大约 1000 行的表,每行都有一个唯一的 ID。但是由于某种原因,该表的 id 已经重新启动,之前它是 1000 左右,但现在它从 80 左右重新启动。因此,每次用户插入新行时,新分配的 id 大约从 80 开始,我得到两个应该是唯一的重复 id,是的,你可以理解这个问题。我查看了对该表执行任何操作的所有查询,但没有一个可以做到这一点。我总是依赖自动分配 id 的内置机制。

你见过这样的事吗?

表的架构如下所示:

CREATE TABLE mytable(
  id INTEGER PRIMARY KEY
);

如您所见,我不使用 AUTOINCREMENT。但是据我了解,即使用户删除了 id 为 80 的行,也可以提供一个新插入的行 id 80,但现在它不像现在这样工作,即使我已经有行,数据库也只会不断增加 id相同的身份证。它不应该像这样工作吗:

HIGHEST ROWID IS 1000, ALL IDS FROM 0-1000 ARE TAKEN
USER DELETES ROW WITH ID 80
INSERT A NEW ROW
    THE ID OF THE INSERTED ROW MIGHT NOW BE 80
    SETS THE ID OF THE INSERTED ROW TO 80
INSERT A NEW ROW
    THE ID OF THE INSERTED ROW CAN NOT BE 81 AS THIS IS ALREADY TAKEN
    SETS THE ID OF THE INSERTED ROW TO 1001

这不应该是这样的吗?

【问题讨论】:

  • 这些id是你生成的,还是sqlite生成的?
  • 它们是由 sqlite 生成的,我用有关架构的一些信息来更新问题。
  • 你的插入查询是什么样的?
  • 真的很简单,就像:INSERT INTO mytable (field1, field2) VALUES (value1, value2)

标签: sqlite


【解决方案1】:

您是否将您的 id 列声明为(n 个自动递增)主键?

CREATE TABLE mytable(
  id INTEGER PRIMARY KEY AUTOINCREMENT
);

通过添加 autoincrement 关键字,您可以确保生成的所有键在表的生命周期内都是唯一的。通过省略它,密钥仍然是唯一的,但它可能会生成已被其他已删除条目使用的密钥。请注意,使用自动增量可能会导致问题,因此请在添加之前对其进行read up

编辑 这有点远,但 sqlite 只支持每个表一个主键。如果您声明了多个主键,则需要将除您实际要用作主键的主键之外的所有主键都声明为“唯一”。因此

CREATE TABLE mytable(
  id INTEGER PRIMARY KEY, 
  otherId INTEGER UNIQUE
);

【讨论】:

  • 非常感谢您的回答!在我做了很多测试之后,缺少的是 AUTOINCREMENT 部分。我可以以某种方式使用 ALTER 将 AUTOINCREMENT 添加到我已经创建的表中吗?
  • Martin,在这个线程中查看最高的 vted 答案:stackoverflow.com/questions/631060/…
【解决方案2】:

没有代码和架构很难说,但我的直觉是,这个唯一 ID 既不是唯一也不是主键,他们应该这样做。

您如何确保(理论上)id 是唯一的?你的插入查询是什么样的?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2016-09-02
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    相关资源
    最近更新 更多