Как установить начальное значение для поля AUTOINCREMENT в SQLite?
Установить начальное значение для AUTOINCREMENT в SQLite
Ответ 1
Явно вставьте value-1
в таблицу, а затем удалите строку.
Изменить: следующий комментарий вниз, в котором обсуждается редактирование таблицы SQLITE_SEQUENCE
, возможно, предпочтительнее: fooobar.com/questions/125662/...
Ответ 2
На веб-сайте 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, который вы хотите, а таблица - имя таблицы.
Ответ 3
Я использую следующий запрос, который решает проблему, когда 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;
Ответ 4
Один из способов сделать это - вставить первую строку , явно указывая идентификатор строки, с которой вы хотите начать с. Затем SQLite вставляет идентификаторы строк, которые выше предыдущего.
Ответ 5
В решении с таблицей SQLITE_SEQUENCE запись в эту таблицу, кажется, добавляется после добавления первой вставки в таблицу с добавлением столбца автоинкремента. В некоторых случаях это может вызвать проблемы (например, автоинкремент все же начинается с 1, а не из желаемого значения).
Ответ 6
Теперь я использовал это как мое решение:
REPLACE INTO sqlite_sequence (name, seq) VALUES ('<table>', <n>)
Эта работа для меня. Спасибо за ответ выше.
Ответ 7
Просто хотел добавить несколько заметок к очень благодарному ответу от iTech:
- Имя столбца в sqlite_sequence чувствительно к регистру. (Возможно, это только я, но исходя из других баз данных, я всегда предполагаю, что при сравнении строк регистр не учитывается).
- SQLite кажется надежным: если число в sqlite_sequence неверно и приведет к дублированию значения rowid, sqlite будет использовать следующий доступный номер для rowid (проверено с sqlite 3.28)
- То же самое верно, если строка в sqlite_sequence удаляется.
- Я использовал, как это было предложено в комментарии, "ГДЕ НЕ СУЩЕСТВУЕТ ВЫБРАТЬ имя из sqlite_sequence WHERE name = 'table'" вместо проверки "changes()"