SQLite ha un modo interessante di gestire le colonne con incremento automatico. Per colonne autoincrementanti, intendo colonne che si incrementano automaticamente ogni volta che vengono inseriti nuovi dati.
Questo è simile a un IDENTITY
colonna in SQL Server o un AUTO_INCREMENT
colonna in MySQL
.
Questo articolo spiega come creare AUTOINCREMENT
colonne in SQLite.
Crea automaticamente una colonna con incremento automatico
Per impostazione predefinita, quando definisci una colonna come INTEGER PRIMARY KEY
, si incrementerà automaticamente ogni volta che inserisci NULL in quella colonna.
Esempio:
CREATE TABLE Cats(
CatId INTEGER PRIMARY KEY,
CatName
);
In questa tabella, il CatId colonna è una colonna di incremento automatico. Questo perché è stato definito usando INTEGER PRIMARY KEY
.
Ora, quando inserisco NULL in quella colonna, il CatId incrementi automatici delle colonne:
INSERT INTO Cats VALUES
( NULL, 'Brush' ),
( NULL, 'Scarcat' ),
( NULL, 'Flutter' );
SELECT * FROM Cats;
Risultato:
CatId CatName ---------- ---------- 1 Brush 2 Scarcat 3 Flutter
È importante notare che puoi sovrascrivere AUTOINCREMENT
valore inserendo il proprio valore. In altre parole, AUTOINCREMENT
inserisce un valore solo se non lo fai.
Il modo in cui funziona è il NULL
viene automaticamente convertito in un numero intero maggiore di uno rispetto al valore più grande di quella colonna su tutte le altre righe della tabella. Se la tabella è vuota, il valore sarà 1
.
Se il valore più grande della colonna è il numero intero più grande possibile (9223372036854775807), SQLite sceglierà a caso una chiave non utilizzata. Questo in genere significa che riutilizzerà le vecchie chiavi che erano state precedentemente eliminate. Se non è possibile trovare una chiave non utilizzata, il INSERT
operazione non riesce con un SQLITE_FULL
errore.
Fondamentalmente ciò significa che se consenti DELETE
operazioni nella tabella, non vi è alcuna garanzia che tutte le righe siano in ordine. È possibile che alcune righe abbiano un valore maggiore rispetto alle righe inserite in un secondo momento.
Pertanto, in questi casi, non puoi fare affidamento su questa colonna se devi ordinare la tabella in ordine crescente o decrescente, in base all'ordine di inserimento delle righe.
Fortunatamente, se questo è un problema per te, c'è una soluzione:l'AUTOINCREMENT
parola chiave.
Utilizza la parola chiave AUTOINCREMENT
In alternativa, puoi scegliere di impostare esplicitamente la colonna per l'incremento automatico utilizzando AUTOINCREMENT
parola chiave.
Uno dei vantaggi dell'utilizzo di questo metodo è che garantisce che tutte le righe siano in ordine crescente. Questo perché non riutilizza le chiavi precedentemente eliminate. Ogni chiave sarà sempre una in più rispetto alla chiave più grande mai esistita in quella tabella. Se la chiave più grande possibile è esistita in precedenza in quella tabella, allora non lo sarà prova a usare le chiavi precedentemente cancellate. Il INSERT
fallirà con un SQLITE_FULL
codice di errore.
Lo svantaggio dell'utilizzo di AUTOINCREMENT
la parola chiave è che utilizza CPU, memoria, spazio su disco e sovraccarico di I/O su disco aggiuntivi.
Ecco un esempio di creazione di una colonna a incremento automatico con AUTOINCREMENT
parola chiave:
CREATE TABLE Dogs(
DogId INTEGER PRIMARY KEY AUTOINCREMENT,
DogName
);
Ora inserisci i dati e selezionali:
INSERT INTO Dogs VALUES
( NULL, 'Yelp' ),
( NULL, 'Woofer' ),
( NULL, 'Fluff' );
SELECT * FROM Dogs;
Risultato:
DogId DogName ---------- ---------- 1 Yelp 2 Woofer 3 Fluff
Se dovessi eliminare Fluff da questa tabella, quindi inserisci una nuova riga (usando NULL
come DogId), il nuovo DogId sarebbe 4. In altre parole, non riutilizzerebbe 3.
Se la colonna fosse stata creata senza il AUTOINCREMENT
parola chiave, la riga successiva riutilizzerebbe il DogId di 3.
Se dovessi inserire un DogId di 9223372036854775807 (il numero intero più grande possibile), riceverei il seguente errore al prossimo inserto che specifica NULL
per quella colonna:
Error: database or disk is full
Tuttavia, potrei inserire esplicitamente un valore inferiore a 9223372036854775807, a condizione che quel valore non sia già utilizzato da un'altra riga e INSERT
l'operazione dovrebbe riuscire senza l'errore precedente.
Fondamentalmente, una volta raggiunto 9223372036854775807, l'incremento automatico non funzionerà più.
Colonne definite senza AUTOINCREMENT
la parola chiave non presenta questo problema. Torneranno automaticamente indietro e proveranno a trovare un numero intero inutilizzato da utilizzare. Tuttavia, se sono stati utilizzati tutti i numeri interi (ovvero la tabella contiene effettivamente 9223372036854775807 righe), anche quelle colonne risulteranno nell'errore precedente.