SQLite Сбросить поле первичного ключа - PullRequest
99 голосов
/ 21 октября 2009

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

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

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

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

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

Любая помощь будет отличной.

Ответы [ 4 ]

209 голосов
/ 21 октября 2009

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

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

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

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

33 голосов
/ 09 апреля 2015

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

UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='table_name';
0 голосов
/ 22 ноября 2013

Если вы хотите сбросить каждый 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);
}
0 голосов
/ 09 ноября 2013

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

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