SQLite
 sql >> Database >  >> RDS >> SQLite

Crea una colonna di incremento automatico in SQLite

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.