SQLite-Primärschlüsselfeld zurücksetzen

118

Ich habe einige Tabellen in SQLite und versuche herauszufinden, wie das automatisch inkrementierte Datenbankfeld zurückgesetzt werden kann.

Ich habe gelesen, dass DELETE FROM tablenamealles gelöscht und das Feld für die automatische Inkrementierung zurückgesetzt werden sollte 0, aber wenn ich dies tue, werden nur die Daten gelöscht . Wenn ein neuer Datensatz eingefügt wird, wird die automatische Inkrementierung dort fortgesetzt, wo sie vor dem Löschen aufgehört hat.

Meine identFeldeigenschaften sind wie folgt:

  • Feldtyp :integer
  • Feld Flags : PRIMARY KEY, AUTOINCREMENT,UNIQUE

Ist es wichtig, dass ich die Tabelle in SQLite Maestro erstellt habe und die DELETEAnweisung auch in SQLite Maestro ausführe ?

Jede Hilfe wäre großartig.

Nathan
quelle

Antworten:

244

Versuche dies:

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

SQLite Autoincrement

SQLite verfolgt mithilfe der speziellen SQLITE_SEQUENCETabelle die größte ROWID, die eine Tabelle jemals gehalten hat . Die SQLITE_SEQUENCETabelle wird automatisch erstellt und initialisiert, wenn eine normale Tabelle erstellt wird, die eine AUTOINCREMENT-Spalte enthält. Der Inhalt der SQLITE_SEQUENCE-Tabelle kann mit normalen UPDATE-, INSERT- und DELETE-Anweisungen geändert werden. Änderungen an dieser Tabelle werden jedoch wahrscheinlich den AUTOINCREMENT-Schlüsselgenerierungsalgorithmus stören. Stellen Sie sicher, dass Sie wissen, was Sie tun, bevor Sie solche Änderungen vornehmen.

Nick Dandoulakis
quelle
9
Nur eine kleine Randnotiz: Tabellenname in wo Klausel Groß- und Kleinschreibung unterscheidet
321X
5
Eine andere Möglichkeit besteht darin, die Tabelle sqlite_sequence zu aktualisieren. update sqlite_sequence set seq = 0 where name = '<Tabellenname>' Dadurch wird die Zeilen-ID der Tabelle sqlite_sequence nicht zurückgesetzt.
binär
@binary, danke, dass Sie einen alternativen Weg erwähnt haben :) Ich möchte darauf hinweisen, dass SQLite "gelöschten" Speicherplatz wiederverwendet, sodass es keinen großen Unterschied macht, welche Lösung wir wählen.
Nick Dandoulakis
1
Beachten Sie, dass SQLite die Tabelle sqlite_sequence nur erstellt, wenn Sie eine Spalte für die automatische Inkrementierung definieren. Es existiert vorher nicht.
Zachary Yates
@ZacharyYates zwar, aber es wird bereits im zitierten Text erwähnt.
Nick Dandoulakis
47

Sie können nach Aktualisierungssequenz nach gelöschten Zeilen in Ihrer Tabelle zurücksetzen

UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='table_name';
Huỳnh Ngọc Bang
quelle
Kannst du mir sagen, wie das für den Raum geht?
Psycho
was meinst du mit @Psycho? Ich kann nicht verstehen :)
Huỳnh Ngọc Bang
Eigentlich habe ich gefragt, wie das in der Raumdatenbank geht ... nun, das Problem ist vorerst gelöst
Psycho
@Psycho kannst du mir sagen, wie du das mit der Room-Datenbank benutzt hast?
Prakashpun
1

Alternativ können Sie die Tabelle sqlite_sequence bearbeiten, wobei der Feldname der Name Ihrer Tabelle ist, wenn Sie über den Sqlite-Datenbankbrowser verfügen und eher zu einer GUI-Lösung neigen. Doppelklicken Sie auf die Zelle für das Feld seq und ändern Sie den Wert im daraufhin angezeigten Dialogfeld auf 0.

Daniel Lefebvre
quelle
0

Wenn Sie jede RowId über den Inhaltsanbieter zurücksetzen möchten, versuchen Sie dies

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);
}
UmAnusorn
quelle