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