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

80

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

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

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

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

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

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

Теги:

4 ответа

167
Лучший ответ

Попробуйте следующее:

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

SQLite Autoincrement

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

  • 5
    Небольшое примечание: имя таблицы в предложении where чувствительно к регистру
  • 5
    Другой способ - обновить таблицу sqlite_sequence. обновить sqlite_sequence set seq = 0, где name = '<tablename>' Это не сбрасывает идентификатор строки таблицы sqlite_sequence.
Показать ещё 5 комментариев
20

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

UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='table_name';
0

Если вы хотите reset каждый 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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню