Ответ 1
Явно вставьте value-1
в таблицу, а затем удалите строку.
Изменить: следующий комментарий вниз, в котором обсуждается редактирование таблицы SQLITE_SEQUENCE
, возможно, предпочтительнее: fooobar.com/questions/125662/...
Как установить начальное значение для поля AUTOINCREMENT в SQLite?
Явно вставьте value-1
в таблицу, а затем удалите строку.
Изменить: следующий комментарий вниз, в котором обсуждается редактирование таблицы SQLITE_SEQUENCE
, возможно, предпочтительнее: fooobar.com/questions/125662/...
На веб-сайте SQLite:
SQLite отслеживает самый большой ROWID, который когда-либо проводила таблица, используя специальную таблицу
SQLITE_SEQUENCE
. ТаблицаSQLITE_SEQUENCE
создается и инициализируется автоматически, когда создается нормальная таблица, содержащая столбец AUTOINCREMENT. Содержимое таблицыSQLITE_SEQUENCE
может быть изменено с помощью обычных операторов UPDATE, INSERT и DELETE. Но внесение изменений в эту таблицу, вероятно, нарушит алгоритм генерации ключа AUTOINCREMENT. Убедитесь, что вы знаете, что делаете, прежде чем предпринимать такие изменения.
Я пробовал это, и он работает:
UPDATE SQLITE_SEQUENCE SET seq = <n> WHERE name = '<table>'
Где n + 1 - следующий ROWID, который вы хотите, а таблица - имя таблицы.
Я использую следующий запрос, который решает проблему, когда sqlite_sequence не имеет записи для таблицы (т.е. первая запись еще не добавлена к таблице), в противном случае она обновляет последовательность.
BEGIN TRANSACTION;
UPDATE sqlite_sequence SET seq = <n> WHERE name = '<table>';
INSERT INTO sqlite_sequence (name,seq) SELECT '<table>', <n> WHERE NOT EXISTS
(SELECT changes() AS change FROM sqlite_sequence WHERE change <> 0);
COMMIT;
Один из способов сделать это - вставить первую строку , явно указывая идентификатор строки, с которой вы хотите начать с. Затем SQLite вставляет идентификаторы строк, которые выше предыдущего.
В решении с таблицей SQLITE_SEQUENCE запись в эту таблицу, кажется, добавляется после добавления первой вставки в таблицу с добавлением столбца автоинкремента. В некоторых случаях это может вызвать проблемы (например, автоинкремент все же начинается с 1, а не из желаемого значения).
Теперь я использовал это как мое решение:
REPLACE INTO sqlite_sequence (name, seq) VALUES ('<table>', <n>)
Эта работа для меня. Спасибо за ответ выше.
Просто хотел добавить несколько заметок к очень благодарному ответу от iTech: