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 гарантирует, что ключи никогда не будут повторно использоваться. Так что, если вы удалите Джона, 1 никогда не будет повторно использоваться как идентификатор. В любом случае, если вы используете PRIMARY KEY (с необязательным AUTOINCREMENT) и не используете идентификаторы, предполагается, что SQLite завершится с ошибкой SQLITE_FULL, а не обтеканием.
Используя IDENTITY, вы открываете (вероятно, не относящуюся к делу) вероятность того, что ваше приложение будет неправильно обернуто, если база данных была когда-либо заполнена. Это вполне возможно, потому что столбцы IDENTITY в SQLite могут содержать любое значение (включая отрицательные целые числа). Снова попробуйте:
insert into bar VALUES ("What the hell", "Bill");
insert into bar VALUES (-9, "Mary");
Оба из них полностью действительны. Они были бы действительны для баз тоже. Однако , с базой вы можете избежать ручного указания идентификатора. Таким образом, в вашем столбце идентификаторов никогда не будет мусора.