Большинство систем с автоматически увеличивающимися столбцами отслеживают последнее введенное значение (или следующее, которое должно быть вставлено) и никогда не переиздают число (дают одно и то же число дважды), даже если последний выпущенный номер был удален из таблицы.
Судя по тому, что вы спрашиваете, SQLite является еще одной такой системой.
Если в системе есть какой-либо параллелизм, то это рискованно, но для однопользовательской системы, работающей с одним приложением, вам может не понравиться:
SELECT MAX(id_column) + 1 FROM YourTable
, чтобы найти следующее доступное значение. В зависимости от поведения SQLite вы можете включить его в список VALUES оператора INSERT:
INSERT INTO YourTable(id_column, ...)
VALUES((SELECT MAX(id_column) + 1 FROM YourTable), ...);
Это может не сработать; Возможно, вам придется сделать это как две операции. Обратите внимание, что если есть какой-либо параллелизм, форма двух операторов является плохой идеей TM . Ограничение уникальности первичного ключа обычно предотвращает аварийное завершение, но одно из двух одновременных операторов не выполняется, потому что оно пытается вставить значение, которое только что вставлено другим - поэтому оно должно повторить попытку и надеяться на лучшее. Очевидно, что сотовый телефон имеет меньше параллелизма, чем, скажем, веб-сервер, поэтому проблема, соответственно, менее серьезна. Но будь осторожен.
В целом, лучше всего, чтобы в последовательности появлялись пропуски, не беспокоясь об этом. Обычно нет необходимости беспокоиться о них. Если вам нужно беспокоиться о пробелах, не позволяйте людям делать их в первую очередь. Или переместите существующую строку, чтобы заполнить пробел, когда вы делаете удаление, которое его создает. Это по-прежнему оставляет удаления в конце, создавая пробелы при добавлении новых строк, поэтому лучше всего преодолеть менталитет «это должна быть непрерывная последовательность чисел». Автоинкремент гарантирует уникальность; это не гарантирует смежности.