Эффективно да, но не совсем.
То есть все, что AUTOINCREMENT делает, это добавляет ограничение, которое требует, чтобы значение, назначенное столбцу, было выше, чем любое существующее значение, или выше, чем любое значение, которое использовалось в этом столбце.
Но это еще не все, чем your_column INTEGER PRIMARY KEY
(AUTOINCREMENT может использоваться только для такого столбца, и в таблице может быть только 1 такой столбец) делает этот столбец псевдонимом скрытого rowid столбец.
Индекс rowid - это то, что индексируется, и в основном это самый основной и самый эффективный индекс, который всегда существует, если таблица не определена с помощью ключевого слова WITHOUT ROWID.
Таким образом, столбец AUTOINCREMENT является псевдонимом столбца rowid и использует другой, более дорогой алгоритм, чем псевдоним rowid без АВТОИНЦЕПЦИИ.
То есть без AUTOINCREMENT значение, сгенерированное для столбца rowid , найдет максимальное значение в таблице и увеличит его. Если это значение не превышает 9223372036854775807, в этом случае SQlite предпримет некоторые попытки найти неиспользуемое более низкое значение (обычно от 1 до 9223372036854775807).
С AUTOINCREMENT алгоритм принимает более высокое значение максимального значения и значение, сохраненное в таблице sqlite_sequence для соответствующей таблицы, и использует это (таким образом, любые удаленные более высокие значения не будут повторно используется). Однако, если используется 9223372036854775807, возникает ошибка SQLITE_FULL .
Следует отметить следующее: -
Ключевое слово AUTOINCREMENT накладывает дополнительный процессор, память, дисковое пространство и
издержки дискового ввода-вывода, и их следует избегать, если в этом нет особой необходимости. это
обычно не требуется.
Автоинкремент SQLite Вы, возможно, захотите прочитать это.
Дополнительно
исправление комментария: -
Если я не использую AUTOINCREMENT, я должен явно создать уникальный
целочисленные идентификаторы, а затем вставьте их в базу данных каждый раз, когда новая строка
вставлена.
Следующее демонстрирует, что для AUTOINCREMENT нет требования: -
CREATE TABLE IF NOT EXISTS xyz (ID INTEGER PRIMARY KEY);
INSERT INTO xyz VALUES(null);
SELECT * FROM xyz;
После двойного запуска получается: -