2009-10-21 4 views
87

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

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

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

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

делает это дело я построил таблицу в SQLite Maestro и я выполняю stat12 nt в SQLite Maestro?

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

ответ

177

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

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. Но , внося изменения в эту таблицу , вероятно, нарушит алгоритм генерации ключей AUTOINCREMENT . Удостоверьтесь, что вы знаете, что делаете до того, как вы выполните .

+3

Спасибо, что работало отлично. – Nathan

+3

Просто небольшое примечание стороны: Имя таблицы в том месте, где условие чувствительно к регистру – 321X

+0

@ 321X, это очень хорошая точка. Благодарю. –

0

В качестве альтернативного варианта, если у вас есть браузер Sqlite Database Browser и более склонны к графическому интерфейсу, вы можете редактировать таблицу 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); 
} 
23

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

UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='table_name'; 
Смежные вопросы