Resetuj podstawowe pole klucza SQLite


118

Mam kilka tabel w SQLite i próbuję dowiedzieć się, jak zresetować pole bazy danych o automatycznym zwiększaniu.

Czytałem, że DELETE FROM tablenamepowinno usunąć wszystko i zresetować pole auto-incremement z powrotem do 0, ale kiedy to zrobię, po prostu usuwa dane. Po wstawieniu nowego rekordu funkcja autoinkrementacji rozpoczyna się w miejscu, w którym została przerwana przed usunięciem.

Moje identwłaściwości pola są następujące:

  • Typ pola :integer
  • Polowe Flagi : PRIMARY KEY, AUTOINCREMENT,UNIQUE

Czy ma znaczenie, że zbudowałem tabelę w SQLite Maestro i wykonuję DELETEinstrukcję również w SQLite Maestro?

Każda pomoc byłaby świetna.

Odpowiedzi:


244

Spróbuj tego:

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

Autoinkrementacja SQLite

SQLite śledzi największy ROWID, jaki kiedykolwiek posiadał stół, używając specjalnej SQLITE_SEQUENCEtabeli . SQLITE_SEQUENCETworzenia tabeli i inicjowane automatycznie zawsze, gdy normalne tabela zawiera kolumnę autoIncrement jest tworzony. Zawartość tabeli SQLITE_SEQUENCE można modyfikować za pomocą zwykłych instrukcji UPDATE, INSERT i DELETE. Jednak wprowadzanie modyfikacji w tej tabeli prawdopodobnie zakłóci algorytm generowania kluczy AUTOINCREMENT. Upewnij się, że wiesz, co robisz, zanim podejmiesz takie zmiany.


9
Mała uwaga na marginesie: nazwa tabeli, w której w klauzuli rozróżniana jest
wielkość

5
innym sposobem jest aktualizacja tabeli sqlite_sequence. aktualizacja sqlite_sequence set seq = 0, gdzie name = '<tablename>' Nie spowoduje to zresetowania rowid w tabeli sqlite_sequence.
binarny

@binary, dzięki za wspomnienie o alternatywnym sposobie :) Chciałbym zauważyć, że SQLite ponownie wykorzystuje „usuniętą” przestrzeń, więc nie ma większego znaczenia, które rozwiązanie wybierzemy.
Nick Dandoulakis

1
Zauważ, że SQLite tworzy tabelę sqlite_sequence tylko podczas definiowania kolumny autoincrement. Wcześniej nie istnieje.
Zachary Yates

@ZacharyYates, owszem, ale jest już wspomniany w cytowanym tekście.
Nick Dandoulakis

48

Możesz zresetować przez sekwencję aktualizacji po usuniętych wierszach w tabeli

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

możesz mi powiedzieć, jak to zrobić dla pokoju?
Psycho

co masz na myśli @Psycho? Nie rozumiem :)
Huỳnh Ngọc Bang

właściwie to pytałem jak to zrobić w Bazie Danych Pokojów ..... cóż, problem na razie rozwiązany
Psycho

@Psycho, czy możesz mi powiedzieć, jak to wykorzystałeś, używając bazy danych pokoju?
prakashpun

1

Alternatywną opcją, jeśli masz przeglądarkę bazy danych Sqlite i jesteś bardziej skłonny do rozwiązania z graficznym interfejsem użytkownika, możesz edytować tabelę sqlite_sequence, gdzie nazwa pola to nazwa twojej tabeli. Kliknij dwukrotnie komórkę dla pola seq i zmień wartość na 0 w wyświetlonym oknie dialogowym.


0

Jeśli chcesz zresetować każdy RowId za pośrednictwem dostawcy zawartości, spróbuj tego

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);
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.