Как уменьшить Авто приращение _id в Androidite SQLite? - PullRequest
1 голос
/ 09 марта 2012

В Android я создал базу данных SQLite, содержащую одну таблицу, которая, в свою очередь, имеет столбец идентификатора с автоприращением.

Предположим, у меня 4 записи. Когда я удаляю их все, следующая вставленная запись имеет идентификатор 5-й записи (4), но мне нужно вставить эту запись, начиная снова с 1-й позиции, то есть 0.

Как мне этого добиться?

Ответы [ 3 ]

2 голосов
/ 09 марта 2012

РЕДАКТИРОВАТЬ: Может быть, я должен уточнить, что просто вставка строк с правильным идентификатором вместо манипулирования порядковым номером определенно является лучшей идеей, чем метод ниже. Если в таблице нет строки с id = 3, вы можете просто вставить фиксированное значение в id даже в таблицу AUTOINCREMENT.


Тем не менее, если вы действительно уверены , вы можете установить для значения автоматического приращения любое значение, используя;

UPDATE sqlite_sequence set seq=<next sequence no -1> where name=<table name>;

То есть, если вы хотите, чтобы AUTOINCREMENT при следующей вставке в таблицу 'TableA' генерировал 5, вам нужно;

UPDATE sqlite_sequence set seq=4 where name='TableA';

Обратите внимание, что сброс seq ведет себя немного иначе, чем вы можете ожидать, это просто означает, что самый низкий сгенерированный идентификатор будет большим из seq + 1 и max id still in the table + 1.

То есть, если вы удалите все значения> = 5, вы можете сбросить значение последовательности до 4 и создать 5 как следующий порядковый номер, , но если у вас все еще есть идентификатор 10 в таблице, следующий сгенерированное число будет 11 вместо .

Может быть, мне следует указать на тот факт, что я не могу найти такое точное поведение, документированное где-либо, поэтому я не буду полагаться на поведение для каждой будущей версии sqlite. Это работает сейчас, может не завтра.

1 голос
/ 09 марта 2012

сбросить значение автоматического приращения в вашей таблице перед вставкой 5-й записи:

Команда SQL:

ALTER TABLE [tablename] AUTO_INCREMENT=[final value]
1 голос
/ 09 марта 2012

Попробуйте это

delete from your_table;    
delete from sqlite_sequence where name='your_table';

SQLite отслеживает самый большой ROWID, который когда-либо имела таблица, используя специальную таблицу SQLITE_SEQUENCE. Таблица SQLITE_SEQUENCE создается и инициализируется автоматически при создании обычной таблицы, содержащей столбец AUTOINCREMENT. Содержимое таблицы SQLITE_SEQUENCE можно изменить с помощью обычных операторов UPDATE, INSERT и DELETE. Но внесение изменений в эту таблицу, вероятно, нарушит алгоритм генерации ключа AUTOINCREMENT. Убедитесь, что вы знаете, что делаете, прежде чем предпринимать такие изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...