Как сбросить счётчик AUTOINCREMENT в таблице в 1 после удаления всех записей?
Был такой вопрос, в результате которого получилось использовать AUTOINCREMENT.
После чего, через запрос:
DELETE FROM ranobes;
Удалил все запииси из таблицы. Далее, добавил новую запись, которая проиндексировалось с 6 (в удаленной таблице было 5 записей), то есть индексация сработала таким образом, как будто я и не удалял те записи.
Вопрос таков, а как начать заново индексирование с 1?
Ответы (2 шт):
В Sqlite есть специальная таблица SQLITE_SEQUENCE для этого (с которой нужно быть предельно осторожным).
UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE name = 'ranobes';
В вашем случае, когда в таблице нет строк, можно также полностью пересоздать таблицу: DROP TABLE/CREATE TABLE.
Дополнение к ответу уважаемого @vp_arth:
После небольших эксперементов с SQLite version 3.25.2 2018-09-25 пришел к выводу, что SQLite делает проверку при обнулении счетчика в SQLITE_SEQUENCE и если на момент вставки в непустую таблицу значение ее счетчика меньше последнего значения из таблицы, то SQLite сам исправит значение счетчика на last_seq_number.
Пример:
sqlite> SELECT * FROM ranobes;
ranobe_id name
---------- ----------
1 name1
2 name2
3 name3
4 name4
sqlite> SELECT * FROM SQLITE_SEQUENCE;
name seq
---------- ----------
ranobes 4
т.е. изначально в таблице 4 записи и значение счетчика во внутренней таблице SQLITE_SEQUENCE - 4.
Теперь сбросим значение счетчика в ноль:
sqlite> UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE name = 'ranobes';
sqlite> SELECT * FROM SQLITE_SEQUENCE;
name seq
---------- ----------
ranobes 0
и попробуем вставить новую запись не опустошив таблицу:
sqlite> INSERT INTO ranobes (name) VALUES("name5");
sqlite> SELECT * FROM SQLITE_SEQUENCE;
name seq
---------- ----------
ranobes 5
sqlite> SELECT * FROM ranobes;
ranobe_id name
---------- ----------
1 name1
2 name2
3 name3
4 name4
5 name5
SQLite сам исправил значение счетчика!
Т.е. для того чтобы сбросить значение счетчика нужно также опустошить таблицу:
sqlite> DELETE FROM ranobes;
sqlite> UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE name = 'ranobes';
sqlite> INSERT INTO ranobes (name) VALUES("name1");
sqlite> SELECT * FROM SQLITE_SEQUENCE;
name seq
---------- ----------
ranobes 1
sqlite> SELECT * FROM ranobes;
ranobe_id name
---------- ----------
1 name1