sql >> Database >  >> RDS >> SQLite

Maak een Auto-Increment-kolom in SQLite

SQLite heeft een interessante manier om kolommen met automatisch ophogen te verwerken. Met kolommen die automatisch worden verhoogd, bedoel ik kolommen die automatisch worden verhoogd wanneer nieuwe gegevens worden ingevoegd.

Dit is vergelijkbaar met een IDENTITY kolom in SQL Server of een AUTO_INCREMENT kolom in MySQL .

In dit artikel wordt uitgelegd hoe u AUTOINCREMENT . aanmaakt kolommen in SQLite.

Maak automatisch een kolom voor automatisch verhogen

Standaard, wanneer u een kolom definieert als INTEGER PRIMARY KEY , het wordt automatisch verhoogd wanneer u NULL invoegt in die kolom.

Voorbeeld:

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

In deze tabel is de CatId kolom is een auto-increment kolom. Dit komt omdat het is gedefinieerd met behulp van INTEGER PRIMARY KEY .

Als ik nu NULL in die kolom invoeg, wordt de CatId kolom automatische verhogingen:

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

SELECT * FROM Cats;

Resultaat:

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

Het is belangrijk op te merken dat u de AUTOINCREMENT . kunt overschrijven waarde door uw eigen waarde in te voeren. Met andere woorden, AUTOINCREMENT voegt alleen een waarde in als u dat niet doet.

De manier waarop het werkt is, de NULL wordt automatisch geconverteerd naar een geheel getal dat één groter is dan de grootste waarde van die kolom over alle andere rijen in de tabel. Als de tabel leeg is, is de waarde 1 .

Als de grootste waarde van de kolom het grootst mogelijke gehele getal is (9223372036854775807), dan kiest SQLite willekeurig een ongebruikte sleutel. Dit betekent meestal dat oude sleutels die eerder zijn verwijderd, worden hergebruikt. Als een ongebruikte sleutel niet kan worden gevonden, de INSERT bewerking mislukt met een SQLITE_FULL fout.

Wat dit in feite betekent, is, als u DELETE . toestaat bewerkingen in de tabel, dan is er geen garantie dat alle rijen in orde zijn. Het is mogelijk dat sommige rijen een hogere waarde hebben dan rijen die later worden ingevoegd.

Daarom kunt u in dergelijke gevallen niet op deze kolom vertrouwen als u de tabel in oplopende of aflopende volgorde moet ordenen, gebaseerd op de volgorde waarin de rijen zijn ingevoegd.

Gelukkig, als dit een probleem voor je is, is er een oplossing:De AUTOINCREMENT zoekwoord.

Gebruik het AUTOINCREMENT-zoekwoord

U kunt er ook voor kiezen om de kolom expliciet in te stellen op automatisch verhogen met behulp van de AUTOINCREMENT zoekwoord.

Een voordeel van het gebruik van deze methode is dat het garandeert dat alle rijen in oplopende volgorde staan. Dit komt omdat het eerder verwijderde sleutels niet opnieuw gebruikt. Elke sleutel zal er altijd één meer zijn dan de grootste sleutel die ooit in die tabel heeft bestaan. Als de grootst mogelijke sleutel eerder in die tabel heeft bestaan, dan niet probeer eerder verwijderde sleutels te gebruiken. De INSERT zal mislukken met een SQLITE_FULL foutcode.

Het nadeel van het gebruik van de AUTOINCREMENT sleutelwoord is dat het extra CPU, geheugen, schijfruimte en schijf-I/O-overhead gebruikt.

Hier is een voorbeeld van het maken van een automatisch oplopende kolom met de AUTOINCREMENT zoekwoord:

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

Voer nu gegevens in en selecteer deze:

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

SELECT * FROM Dogs;

Resultaat:

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

Als ik Fluff . zou verwijderen uit deze tabel en voeg vervolgens een nieuwe rij in (met behulp van NULL als de DogId), zou de nieuwe DogId 4 zijn. Met andere woorden, het zou 3 niet hergebruiken.

Als de kolom was gemaakt zonder de AUTOINCREMENT trefwoord, dan zou de volgende rij de DogId van 3 opnieuw gebruiken.

Als ik een DogId van 9223372036854775807 (het grootst mogelijke gehele getal) zou invoegen, zou ik de volgende foutmelding krijgen bij de volgende invoeging die NULL specificeert voor die kolom:

Error: database or disk is full

Ik zou echter expliciet een waarde kunnen invoegen die lager is dan 9223372036854775807, zolang die waarde niet al door een andere rij wordt gebruikt, en de INSERT operatie zou moeten slagen zonder de bovenstaande fout.

Kortom, zodra u 9223372036854775807 bereikt, werkt de automatische verhoging niet meer.

Kolommen gedefinieerd zonder de AUTOINCREMENT trefwoord hebben dit probleem niet. Ze gaan automatisch terug en proberen een ongebruikt geheel getal te vinden om in plaats daarvan te gebruiken. Als echter alle gehele getallen zijn gebruikt (d.w.z. de tabel bevat in feite 9223372036854775807 rijen), dan zullen zelfs die kolommen resulteren in de bovenstaande fout.


  1. CASCADE VERWIJDEREN slechts één keer

  2. Hoe een tabel te maken met behulp van een selectiequery in SQL Server?

  3. Is er een manier om te selecteren zonder vergrendeling in MySQL te veroorzaken?

  4. Geheugendruk Analyse Risicostatus