AUTOINCREMENT - это дополнительное ключевое слово, которое можно использовать только в одной ситуации, и это для ПЕРВИЧНОГО КЛЮЧА, который имеет тип столбца, в частности, INTEGER (зависит от регистра).
Если не использовать в этой ситуации, тогда произойдет синтаксическая ошибка.
A PRIMARY KEY является основным (для пользователя) индексом.
Если кодируется column INTEGER PRIMARY KEY
, то этот столбец становится псевдонимом столбца rowid .
- Столбец rowid (если таблица не определена с помощью ключевого слова WITHOUT ROWID) - это столбец, который нормально скрыт (например, SELECT * не возвращает rowid ). rowid является реальным первичным индексом, его значением является целое число (64-разрядное целое число со знаком), изначально 1, оно всегда уникально и, как правило, увеличивается и часто на 1).Он однозначно идентифицирует строку.
Если используется псевдоним столбца rowid , то, если при вставке строки значение не указывается, это будет автоматически сгенерированное значение в соответствии с rowid если указано значение, строка будет вставлена с этим значением.Отмечая, что значение должно быть целым числом, и оно должно быть уникальным.
Теперь, если наибольшее значение rowid (включая его псевдоним) больше 9223372036854775807, тогда обычный алгоритм,если значение не было предоставлено, будет пытаться использовать свободное нижнее значение.
Если кодируется AUTOINCREMENT , более низкое значение не будет использоваться, вместо этого возникнет исключение SQLITE_FULL.
Таким образом AUTOINCREMENT дополняет INTEGER PRIMARY KEY, чтобы наложить ограничение на то, что уникальное значение всегда должно увеличиваться.Он делает это за определенную плату, так как использует таблицу с именем sqlite_sequence для хранения самого высокого выделенного значения rowid (или его псевдонима).
Таким образом, учитывайте следующее: -
DROP TABLE IF EXISTS aifill;
DROP TABLE IF EXISTS noaifill;
CREATE TABLE noaifill (ID INTEGER PRIMARY KEY);
CREATE TABLE aifill (ID INTEGER PRIMARY KEY AUTOINCREMENT);
INSERT INTO aifill VALUES (null),(null),(null),(null);
INSERT INTO noaifill VALUES (null),(null),(null),(null);
SELECT * FROM aifill JOIN noaifill ON aifill.ID = noaifill.ID;
INSERT INTO aifill VALUES(9223372036854775807);
INSERT INTO noaifill VALUES(9223372036854775807);
SELECT * FROM aifill JOIN noaifill ON aifill.ID = noaifill.ID;
INSERT INTO noaifill VALUES(null);
SELECT * FROM noaifill;
INSERT INTO aifill VALUES(null); -- <<<<<<<<<< FAILS
SELECT * FROM aifill JOIN noaifill ON aifill.ID = noaifill.ID;
Тогда получаются следующие результаты: -



Сообщения: -
DROP TABLE IF EXISTS aifill
> OK
> Time: 0.351s
DROP TABLE IF EXISTS noaifill
> OK
> Time: 0.312s
CREATE TABLE noaifill (ID INTEGER PRIMARY KEY)
> OK
> Time: 0.266s
CREATE TABLE aifill (ID INTEGER PRIMARY KEY AUTOINCREMENT)
> OK
> Time: 0.299s
INSERT INTO aifill VALUES (null),(null),(null),(null)
> Affected rows: 4
> Time: 0.262s
INSERT INTO noaifill VALUES (null),(null),(null),(null)
> Affected rows: 4
> Time: 0.273s
SELECT * FROM aifill JOIN noaifill ON aifill.ID = noaifill.ID
> OK
> Time: 0s
INSERT INTO aifill VALUES(9223372036854775807)
> Affected rows: 1
> Time: 0.366s
INSERT INTO noaifill VALUES(9223372036854775807)
> Affected rows: 1
> Time: 0.291s
SELECT * FROM aifill JOIN noaifill ON aifill.ID = noaifill.ID
> OK
> Time: 0s
INSERT INTO noaifill VALUES(null)
> Affected rows: 1
> Time: 0.259s
SELECT * FROM noaifill
> OK
> Time: 0s
INSERT INTO aifill VALUES(null)
> database or disk is full
> Time: 0s