Подтвердить что ты не робот

Установить начальное значение для AUTOINCREMENT в SQLite

Как установить начальное значение для поля AUTOINCREMENT в SQLite?

4b9b3361

Ответ 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()"