Как установить начальное значение для поля AUTOINCREMENT в SQLite?
Установите начальное значение для AUTOINCREMENT в SQLite
Ответы (6)
Явно вставьте value-1
в таблицу, затем удалите строку.
Изменить: следующий комментарий ниже, в котором обсуждается непосредственное редактирование таблицы SQLITE_SEQUENCE
, вероятно, предпочтительнее: https://stackoverflow.com/a/692871/10093
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, который вам нужен, а table — это имя таблицы.
Я использую приведенный ниже запрос, который решает проблему, когда у 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, а не с желаемого значения).
Просто хотел добавить несколько заметок к очень ценному ответу от iTech:
- Столбец имени в sqlite_sequence чувствителен к регистру. (Возможно, это только я, но, исходя из других баз данных, я всегда предполагаю, что сравнение строк нечувствительно к регистру).
- SQLite кажется надежным: если число в sqlite_sequence неверно и приведет к дублированию значения rowid, sqlite будет использовать следующий доступный номер для rowid (проверено с помощью sqlite 3.28)
- То же самое верно, если строка в sqlite_sequence удаляется.
- Я использовал, как было предложено в комментарии, «ГДЕ НЕ СУЩЕСТВУЕТ ВЫБРАТЬ имя из sqlite_sequence, ГДЕ имя =« таблица »» вместо проверки «изменения ()»