SQLite Reimposta campo chiave primaria


118

Ho alcune tabelle in SQLite e sto cercando di capire come ripristinare il campo del database con incremento automatico.

Ho letto che DELETE FROM tablenamedovrebbe cancellare tutto e reimpostare il campo di incremento automatico su 0, ma quando lo faccio elimina solo i dati. Quando viene inserito un nuovo record, l'incremento automatico riprende da dove era stato interrotto prima dell'eliminazione.

Le mie identproprietà del campo sono le seguenti:

  • Tipo di campo :integer
  • Bandiere campo : PRIMARY KEY, AUTOINCREMENT,UNIQUE

È importante che ho creato la tabella in SQLite Maestro e sto eseguendo anche l' DELETEistruzione in SQLite Maestro?

Qualsiasi aiuto sarebbe grande.

Risposte:


244

Prova questo:

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

SQLite Autoincrement

SQLite tiene traccia del ROWID più grande che una tabella abbia mai tenuto utilizzando la SQLITE_SEQUENCEtabella speciale . La SQLITE_SEQUENCEtabella viene creata e inizializzata automaticamente ogni volta che viene creata una tabella normale che contiene una colonna AUTOINCREMENT. Il contenuto della tabella SQLITE_SEQUENCE può essere modificato utilizzando le normali istruzioni UPDATE, INSERT e DELETE. Ma apportare modifiche a questa tabella probabilmente perturberà l'algoritmo di generazione delle chiavi AUTOINCREMENT. Assicurati di sapere cosa stai facendo prima di intraprendere tali cambiamenti.


9
Solo una piccola nota a
margine

5
un altro modo è aggiornare la tabella sqlite_sequence. update sqlite_sequence set seq = 0 where name = '<tablename>' Questo non reimposta il rowid della tabella sqlite_sequence.
binario

@binary, grazie per aver menzionato un modo alternativo :) Vorrei sottolineare che SQLite riutilizza lo spazio "cancellato", quindi non fa molta differenza quale soluzione sceglieremo.
Nick Dandoulakis

1
Tieni presente che SQLite crea la tabella sqlite_sequence solo quando definisci una colonna con incremento automatico. Non esiste prima di allora.
Zachary Yates,

@ZacharyYates, infatti, ma è già menzionato nel testo citato.
Nick Dandoulakis

48

Puoi reimpostare la sequenza di aggiornamento dopo aver eliminato le righe nella tua tabella

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

puoi dirmi come fare questo per la stanza?
Psycho

cosa intendi con @Psycho? Non riesco a capire :)
Huỳnh Ngọc Bang

in realtà stavo chiedendo come fare questo in Room Database ..... beh il problema per ora è risolto
Psycho

@Psycho puoi dirmi come l'hai usato usando il database della stanza?
prakashpun

1

Come opzione alternativa, se si dispone del browser di database Sqlite e si è più inclini a una soluzione GUI, è possibile modificare la tabella sqlite_sequence dove il nome del campo è il nome della tabella. Fare doppio clic sulla cella per il campo seq e modificare il valore su 0 nella finestra di dialogo che si apre.


0

Se vuoi reimpostare ogni RowId tramite il fornitore di contenuti, prova questo

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);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.