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';

подскажите, как это сделать для комнаты?
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);
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.