SQLite сбросить поле первичного ключа

118

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

Я прочитал, что DELETE FROM tablenameдолжно удалить все и вернуть поле автоинкремента обратно 0, но когда я это сделаю, он просто удалит данные. Когда вставляется новая запись, автоинкремент возобновляется с того места, где он остановился до удаления.

Мои identсвойства поля следующие:

  • Тип поля :integer
  • Поле Флаги : PRIMARY KEY, AUTOINCREMENT,UNIQUE

Имеет ли значение, что я создал таблицу в SQLite Maestro и также выполняю DELETEоператор в SQLite Maestro?

Любая помощь была бы замечательной.

Натан
источник

Ответы:

244

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

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

Автоинкремент SQLite

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

Ник Дандулакис
источник
9
Небольшое примечание: имя таблицы в предложении where чувствительно к регистру
321X
5
другой способ - обновить таблицу sqlite_sequence. update sqlite_sequence set seq = 0 where name = '<tablename>' Это не сбрасывает rowid таблицы sqlite_sequence.
двоичный
@binary, спасибо за упоминание альтернативного способа :) Я хотел бы отметить, что SQLite повторно использует «удаленное» пространство, поэтому на самом деле не имеет большого значения, какое решение мы выберем.
Ник Дандулакис,
1
Обратите внимание, что SQLite создает таблицу sqlite_sequence только тогда, когда вы определяете столбец с автоинкрементом. До этого его не существовало.
Zachary Yates
@ZacharyYates, действительно, но это уже упоминается в цитируемом тексте.
Nick Dandoulakis
48

Вы можете сбросить с помощью последовательности обновления после удаленных строк в вашей таблице

UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='table_name';
Huỳnh Ngọc Bang
источник
подскажите, как это сделать для комнаты?
Psycho
что ты имеешь в виду @Psycho? Я не могу понять :)
Huỳnh Ngọc Bang
на самом деле я спрашивал, как это сделать в базе данных комнат ... ну, на данный момент проблема решена
Psycho
@Psycho, можешь мне сказать, как ты использовал это с помощью базы данных комнат?
Prakashpun
1

В качестве альтернативного варианта, если у вас есть браузер базы данных Sqlite и вы больше склонны к решению с графическим интерфейсом, вы можете отредактировать таблицу sqlite_sequence, где имя поля - это имя вашей таблицы. Дважды щелкните ячейку для поля seq и измените значение на 0 в появившемся диалоговом окне.

Даниэль Лефевр
источник
0

Если вы хотите сбросить каждый RowId через поставщика контента, попробуйте это

rowCounter=1;
do {            
            rowId = cursor.getInt(0);
            ContentValues values;
            values = new ContentValues();
            values.put(Table_Health.COLUMN_ID,
                       rowCounter);
            updateData2DB(context, values, rowId);
            rowCounter++;

        while (cursor.moveToNext());

public static void updateData2DB(Context context, ContentValues values, int rowId) {
    Uri uri;
    uri = Uri.parseContentProvider.CONTENT_URI_HEALTH + "/" + rowId);
    context.getContentResolver().update(uri, values, null, null);
}
UmAnusorn
источник