sql >> Databasteknik >  >> RDS >> SQLite

Skapa en kolumn för automatisk ökning i SQLite

SQLite har ett intressant sätt att hantera kolumner för automatisk ökning. Med automatisk ökning av kolumner menar jag kolumner som ökar automatiskt när ny data infogas.

Detta liknar en IDENTITY kolumn i SQL Server eller en AUTO_INCREMENT kolumn i MySQL .

Den här artikeln förklarar hur du skapar AUTOINCREMENT kolumner i SQLite.

Skapa automatiskt en kolumn för automatisk ökning

Som standard, när du definierar en kolumn som INTEGER PRIMARY KEY , kommer den att öka automatiskt när du infogar NULL i den kolumnen.

Exempel:

CREATE TABLE Cats( 
    CatId INTEGER PRIMARY KEY, 
    CatName
);

I den här tabellen visas CatId kolumn är en kolumn för autoinkrement. Detta beror på att det har definierats med INTEGER PRIMARY KEY .

Nu, när jag infogar NULL i den kolumnen, CatId kolumn automatiska ökningar:

INSERT INTO Cats VALUES 
    ( NULL, 'Brush' ),
    ( NULL, 'Scarcat' ),
    ( NULL, 'Flutter' );

SELECT * FROM Cats;

Resultat:

CatId       CatName   
----------  ----------
1           Brush     
2           Scarcat   
3           Flutter   

Det är viktigt att notera att du kan åsidosätta AUTOINCREMENT värde genom att infoga ditt eget värde. Med andra ord, AUTOINCREMENT sätter bara in ett värde om du inte gör det.

Så det fungerar är NULL konverteras automatiskt till ett heltal som är ett större än det största värdet i den kolumnen över alla andra rader i tabellen. Om tabellen är tom blir värdet 1 .

Om det största värdet i kolumnen är det största möjliga heltal (9223372036854775807), kommer SQLite att välja en oanvänd nyckel slumpmässigt. Detta innebär vanligtvis att den kommer att återanvända gamla nycklar som tidigare raderades. Om en oanvänd nyckel inte kan hittas visas INSERT operation misslyckas med en SQLITE_FULL fel.

Vad detta betyder i grunden är om du tillåter DELETE operationer i tabellen, så finns det ingen garanti för att alla rader kommer att vara i ordning. Det finns en möjlighet att vissa rader kommer att ha ett högre värde än rader som infogas vid ett senare tillfälle.

I sådana fall kan du därför inte lita på den här kolumnen om du behöver sortera tabellen i stigande eller fallande ordning, baserat på den ordning som raderna infogades i.

Lyckligtvis, om detta är ett problem för dig, finns det en lösning:AUTOINCREMENT nyckelord.

Använd sökordet AUTOINCREMENT

Alternativt kan du välja att uttryckligen ställa in kolumnen till automatisk ökning genom att använda AUTOINCREMENT nyckelord.

En fördel med att använda den här metoden är att den garanterar att alla rader kommer att vara i stigande ordning. Detta beror på att den inte återanvänder tidigare borttagna nycklar. Varje nyckel kommer alltid att vara en mer än den största nyckeln som någonsin har funnits i den tabellen. Om den största möjliga nyckeln tidigare har funnits i den tabellen, kommer den inte att göra det försök att använda tidigare raderade nycklar. INSERT kommer att misslyckas med en SQLITE_FULL felkod.

Nackdelen med att använda AUTOINCREMENT Nyckelordet är att den använder extra CPU, minne, diskutrymme och disk I/O-overhead.

Här är ett exempel på hur du skapar en kolumn för automatisk ökning med AUTOINCREMENT nyckelord:

CREATE TABLE Dogs( 
    DogId INTEGER PRIMARY KEY AUTOINCREMENT, 
    DogName
);

Infoga nu data och välj det:

INSERT INTO Dogs VALUES 
    ( NULL, 'Yelp' ),
    ( NULL, 'Woofer' ),
    ( NULL, 'Fluff' );

SELECT * FROM Dogs;

Resultat:

DogId       DogName   
----------  ----------
1           Yelp      
2           Woofer    
3           Fluff     

Om jag skulle ta bort Fluff från den här tabellen, infoga sedan en ny rad (med NULL som DogId) skulle det nya DogId vara 4. Med andra ord skulle det inte återanvända 3.

Om kolumnen hade skapats utan AUTOINCREMENT nyckelord, så skulle nästa rad återanvända DogId of 3.

Om jag skulle infoga ett DogId på 9223372036854775807 (största möjliga heltal), skulle jag få följande felmeddelande vid nästa infogning som anger NULL för den kolumnen:

Error: database or disk is full

Jag kan dock uttryckligen infoga ett värde som är lägre än 9223372036854775807, så länge det värdet inte redan används av en annan rad, och INSERT operationen ska lyckas utan ovanstående fel.

I princip, när du når 9223372036854775807, kommer den automatiska ökningen inte längre att fungera.

Kolumner definierade utan AUTOINCREMENT sökord har inte detta problem. De kommer automatiskt att gå tillbaka och försöka hitta ett oanvänt heltal att använda istället. Men om alla heltal har använts (dvs. tabellen innehåller faktiskt 9223372036854775807 rader), kommer även dessa kolumner att resultera i ovanstående fel.


  1. Kopiera data till ny tabell i MySQL

  2. Hur man ersätter Djangos primärnyckel med ett annat heltal som är unikt för den tabellen

  3. Hur man ändrar kommandoradstolken i SQLite

  4. Är det möjligt att använda en variabel och inte ange en returtyp i postgreSQL?