/ / SQLite: * prevenire * il valore PRIMARY KEY dal reset dopo l'eliminazione di tutte le righe [duplicate] - sqlite, auto-increment

SQLite: * prevenire * il valore PRIMARY KEY dal reset dopo l'eliminazione di tutte le righe [duplicate] - sqlite, auto-increment

Ho una tabella SQLite, con poche colonne, inclusa una colonna "ID" che è INTEGER PRIMARY KEY.

Quando inserisco, questo valore aumenta come previsto.

Tuttavia, quando elimino tutte le righe, il valore di questa colonna torna a 1 nell'inserzione successiva.

C'è un modo per avere il valore della colonna continuare ad aumentare dal valore più alto prima della cancellazione?

Per esempio:

  • (tabella vuota)
  • inserire
  • inserire

(Il valore ID della seconda riga è 2, l'inserimento successivo sarà 3)

  • cancella tutte le righe
  • inserire

(Il valore ID per questa ultima riga è 1, ma voglio che sia 3)

risposte:

2 per risposta № 1

Se la parola chiave AUTOINCREMENT viene visualizzata dopoINTEGER PRIMARY KEY, che modifica l'algoritmo di assegnazione ROWID automatico per impedire il riutilizzo dei ROWID per tutta la durata del database. In altre parole, lo scopo di AUTOINCREMENT è impedire il riutilizzo dei ROWID dalle righe cancellate in precedenza.

https://www.sqlite.org/autoinc.html


0 per risposta № 2

Quale versione di SQLite stai usando? sto usando SQLite version 3.8.11.1. I valori delle chiavi primarie non si ripristinano.

Crea una tabella e inserisci alcuni dati

sqlite> create table test (id integer primary key autoincrement, name varchar(20));
sqlite> select * from test;
sqlite> insert into test (name) values ("hello1");
sqlite> insert into test (name) values ("hello2");
sqlite> select * from test;
id          name
----------  ----------
1           hello1
2           hello2
sqlite> select * from sqlite_sequence;
name        seq
----------  ----------
test        2

In un autoincrement colonna, sqlite mantiene le informazioni della sequenza in sqlite_sequence tabella interna che puoi anche richiedere.

Elimina dati. Si noti che la sequenza rimane così com'è.

sqlite> delete from test;
sqlite> select * from sqlite_sequence;
name        seq
----------  ----------
test        2
sqlite> select * from test;
sqlite> insert into test (name) values ("world1");
sqlite> insert into test (name) values ("world2");
sqlite> select * from test;
id          name
----------  ----------
3           world1
4           world2
sqlite> select * from sqlite_sequence;
name        seq
----------  ----------
test        4

In base a ciò, sembra che i numeri di sequenza rimangano così come sono dopo la cancellazione. Sto usando il autoincrement parola chiave.