在SQLite中,IDENTITY不是自动递增的正确方式。这将要求您在应用程序层面进行递增。在SQLite shell中,请尝试以下操作:
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)并耗尽了ids,则SQLite应该失败,并显示SQLITE_FULL,而不是循环使用。
通过使用IDENTITY,您打开了(可能不相关的)可能性,即如果db满了,您的应用程序将错误地循环使用。这是完全可能的,因为SQLite中的IDENTITY列可以保存任何值(包括负整数)。再次尝试:
insert into bar VALUES ("What the hell", "Bill");
insert into bar VALUES (-9, "Mary");
这两种方法都是完全有效的。对于baz也是如此。然而,使用baz可以避免手动指定id。这样,您的id列中就永远不会有垃圾。