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.