IDENTITY 实际上并不是在 SQLite 中自动递增的正确方法。这将需要您在应用层中进行递增。在 SQLite 外壳中,尝试:
create table bar (id IDENTITY, name VARCHAR);
insert into bar (name) values ("John");
select * from bar;
你会看到 id 只是空的。SQLite 没有赋予 IDENTITY 任何特殊意义,因此它基本上是一个普通的(无类型的)列。
另一方面,如果你这样做:
create table baz (id INTEGER PRIMARY KEY, name VARCHAR);
insert into baz (name) values ("John");
select * from baz;
正如我认为你所期望的那样,它将是 1。
请注意,还有一个 INTEGER PRIMARY KEY AUTOINCREMENT。基本区别在于 AUTOINCREMENT 确保密钥永远不会被重用。因此,如果您删除 John,则 1 将永远不会被重新用作 id。无论哪种方式,如果您使用 PRIMARY KEY(带有可选的 AUTOINCREMENT)并用完 id,则 SQLite 应该会因 SQLITE_FULL 而失败,而不是回绕。
通过使用 IDENTITY,您确实打开了(可能不相关的)如果数据库已满,您的应用程序将错误地环绕的可能性。这是很有可能的,因为 SQLite 中的 IDENTITY 列可以保存任何值(包括负整数)。再次尝试:
insert into bar VALUES ("What the hell", "Bill");
insert into bar VALUES (-9, "Mary");
这两个都是完全有效的。它们对 baz 也有效。 但是,使用 baz 可以避免手动指定 id。这样,您的 id 列中将永远不会有垃圾。