SQLite整数主键,不带赋值/自动递增

cnwbcb6i  于 2023-05-07  发布在  SQLite
关注(0)|答案(2)|浏览(207)

我有一个表,它要求每行都有唯一的ID,并且如果数据库被重建,它要求它们是稳定的(所以我不能只使用rowid),但 * 不 * 要求它们在数据库的生命周期内是唯一的,因为AUTOINCREMENT确保了这一点。根据documentation,这表明我不应该使用AUTOINCREMENT,但我不知道也无法发现任何其他选项来自动为行分配唯一的整数ID,除非手动输入它们,这有点违背了目的。
有没有一种方法可以在SQLite表中拥有一个整数主键,而不需要使用AUTOINCREMENT就可以自动生成值?或者,文档中提出的关于自动增量的问题是否被夸大了,或者不适用于我当前的情况?我并不要求数据库的这一部分具有特别高的性能。

fjnneemd

fjnneemd1#

SQLite Autoincrement的文档说:
[...]
1.在INSERT中,如果ROWID或INTEGER PRIMARY KEY列没有显式指定值,则它将自动填充一个未使用的整数,通常比当前使用的最大ROWID多一个。无论是否使用AUTOINCREMENT关键字,都是如此。
1.如果AUTOINCREMENT关键字出现在INTEGER PRIMARY KEY之后,则会更改自动ROWID分配算法,以防止在数据库的生存期内重用ROWID。换句话说,AUTOINCREMENT的目的是防止重用以前删除的行中的ROWID。
这意味着行自动递增不需要AUTOINCREMENT。它仅决定是否重用已删除行的ID。
这也意味着只有在INSERT时不提供ID时才会自动生成ID。
对您而言,这意味着:
1.你不需要来指定AUTOINCREMENT。
1.当使用INSERT命令并显式指定ID重新构建数据库时,将保留原始ID!
1.当正常使用数据库时,您可以在INSERT中省略ID,SQLite将为您生成一个。为此,将Id列声明为ROWID或INTEGER PRIMARY KEY。

ulydmbyx

ulydmbyx2#

在发布这个问题后,我突然想到了一个愚蠢的想法,事实证明,与我所认为的相反,主整数键实际上是自动分配的,但只有在明确定义为INTEGER PRIMARY KEY的情况下。我不这么认为,因为我在测试的数据库中将一个变量定义为INT PRIMARY KEY,我错误地认为它会以同样的方式运行。我仍然有兴趣了解文档中关于AUTOINCREMENT的担忧是否有道理。

相关问题