sqlite数据库中的唯一ID用完

Posted

技术标签:

【中文标题】sqlite数据库中的唯一ID用完【英文标题】:Running out of unique IDs in sqlite database 【发布时间】:2012-05-30 10:47:47 【问题描述】:

我知道 sqlite 数据库会为每条插入的记录自动生成一个唯一的 id(自动增量)。

有谁知道在执行替换查询时是否有可能用完 sqlite3 数据库中的系统唯一 ID?

我的意思是数据库中的每条数据都有自己的类型。例如,系统唯一 ID 类似于 int。如果生成的唯一 id 等于 MAX_INT,数据库会如何处理下一条记录?

谢谢。

【问题讨论】:

【参考方案1】:

http://www.sqlite.org/autoinc.html

"如果最大的 ROWID 等于最大可能的整数 (9223372036854775807),则数据库引擎开始随机选择正的候选 ROWID,直到找到以前未使用的 ROWID。如果在合理的数字后找不到未使用的 ROWID尝试次数,插入操作失败并返回 SQLITE_FULL 错误。如果没有显式插入负 ROWID 值,则自动生成的 ROWID 值将始终大于零。"

鉴于 sqlite id 是 64 位的,您可以在接下来的 546 年中每 100 毫秒插入一条新记录,然后再用完(这些数字是我编的;但您明白了)。

【讨论】:

实际上是 2.92277266 × 10^10 年 (100 ms * 9223372036854775807 in years)【参考方案2】:

最大可能的 ID 为 9223372036854775807 (2^63 - 1)。无论如何,如果找不到新的自增主键,它会返回 SQLITE_FULL。

还有一点很重要。如果您使用 INTEGER PRIMARY KEY,它可以重用之前在表中但已被删除的键。如果您使用 INTEGER PRIMARY KEY AUTOINCREMENT,它永远不能重复使用自动增量键。

【讨论】:

我明白了。正如我所看到的 - 我不拥有这个 ROWID。正如我从文档中读到的:如果我有一个整数自动增量列,它将是该表的 ROWID 的别名,并且 ROWID 也将是自动增量的。如果我没有自动增量列(只是一个主键整数) - ROWID 也只是主键整数。但在我的表中,我没有任何整数主键。 ROWID 是什么类型的键?会不会是自增?非常感谢 @msj,我相信如果您不明确声明任何类型的 INTEGER PRIMARY KEY,它将使用***算法from here。但是,您只能通过ROWID 访问它。 我也愿意相信。感谢您的回答。

以上是关于sqlite数据库中的唯一ID用完的主要内容,如果未能解决你的问题,请参考以下文章

如何在可变列数据上设置 SQLite 连接

核心数据 SQLite 文件

SQLite UPSERT / 更新或插入

如何在 Sqlite 数据库中的特定数据上更改 Listview 中的行颜色

使用 C# 从 sqlite 3 数据库中检索存储在整数字段中的字符串数据

唯一约束失败:sqlite 数据库:android