假设您有一个具有自动递增主键和 25 条记录的数据库(PK 从 1 变为 25)。删除PK=25的记录;PK 值现在将从 1 到 24。最后添加一条新记录。它的PK值为25。
如果其他表使用值 25 作为外键,这将是非常有问题的。它们将与错误的记录相关联。
这个问题通常是如何解决的?
在几乎所有数据库中,一旦分配,即使删除原始行,自增值也不会被重用。
如果您依赖内置的 ROWID 值而不是将列声明为 AUTOINCREMENT,则 SQLite 中存在异常。在第二种情况下,事情会按您的预期工作(值永远不会被回收)。但是,在第一种情况下,在您描述的情况下(删除编号最高的行),该值将被回收。
但是请考虑在您描述将 ROWID 用作主键并且所有其他引用都受强制外键关系保护的情况下,为了删除值为 25 的记录,必须首先删除对它的所有引用从数据库。
仅当您对主键值具有非强制引用时,才会出现此问题。
尽管如此,我认为将主键显式声明为 AUTOINCREMENT 是一种最佳实践。可以在此处阅读相反的论点:http ://www.sqlite.org/autoinc.html 。
你可以使用唯一标识符吗?我建议如果你不受约束。