Поле "Скидання первинного ключа" 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
Лише невелика бічна примітка: Назва таблиці, у якій застереження
залежно від

5
інший спосіб - оновлення таблиці sqlite_sequence. оновлення sqlite_sequence set seq = 0, де name = '<ім'я табулятора>' Це не буде скинутий рядок таблиці sqlite_sequence.
двійковий

@binary, дякую за згадування альтернативного способу :) Я хотів би зазначити, що SQLite повторно використовує "видалений" простір, тому він насправді не має великої різниці, яке рішення ми оберемо.
Нік Дандолакіс

1
Зауважте, що SQLite створює таблицю sqlite_sequence лише тоді, коли ви визначаєте стовпчик автоматичного збільшення. Він не існував раніше.
Захарій Йейтс

@ZacharyYates, справді, але це вже згадується в тексті, що цитується.
Нік Дандулакіс

48

Ви можете скинути за допомогою послідовності оновлення після видалених рядків у таблиці

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

ви можете мені сказати, як це зробити для кімнати?
Психо

що ти маєш на увазі @Psycho? Я не можу зрозуміти :)
Huỳnh Ngọc Bang

насправді я питав, як це зробити в кімнаті баз даних ..... ну проблема вирішена наразі
Psycho

@Psycho Ви можете мені сказати, як ви користувались цим за допомогою бази даних кімнати?
пракашпун

1

Як альтернативний варіант, якщо у вас є браузер бази даних Sqlite і більше схильний до рішення графічного інтерфейсу, ви можете відредагувати таблицю sqlite_sequence, де ім'я поля є ім'ям вашої таблиці. Двічі клацніть клітинку для послідовності полів та змініть значення на 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.