sql >> Database >  >> RDS >> SQLite

SQLite AUTOINCREMENT

Samenvatting :in deze tutorial leer je over SQLite AUTOINCREMENT kolomkenmerk en wanneer u het in uw tabel moet gebruiken.

Inleiding tot SQLite ROWID tafel

Telkens wanneer u een tabel maakt zonder de WITHOUT ROWID . op te geven optie, krijg je een impliciete kolom voor automatisch ophogen genaamd rowid . De rowid kolomopslag 64-bits geheel getal met teken dat op unieke wijze een rij in de tabel identificeert.

Laten we het volgende voorbeeld bekijken.

Maak eerst een nieuwe tabel met de naam people die twee kolommen heeft:first_name, en last_name :

CREATE TABLE people (
   first_name TEXT NOT NULL,
   last_name TEXT NOT NULL
);Code language: SQL (Structured Query Language) (sql)

Probeer het

Ten tweede, voeg een rij toe in de people tabel met behulp van de volgende INSERT verklaring:

INSERT INTO people (first_name, last_name)
VALUES('John', 'Doe');Code language: SQL (Structured Query Language) (sql)

Probeer het

Ten derde, vraag gegevens op van de people tabel met behulp van de volgende SELECT verklaring:

SELECT
   rowid,
   first_name,
   last_name
FROM
   people;Code language: SQL (Structured Query Language) (sql)

Probeer het

Zoals je duidelijk kunt zien aan de uitvoer, maakt SQLite impliciet een kolom met de naam rowid en wijst automatisch een geheel getal toe wanneer u een nieuwe rij in de tabel invoegt.

Merk op dat je ook kunt verwijzen naar de rowid kolom met zijn aliassen:_rowid_ en oid .

Wanneer u een tabel maakt met een INTEGER PRIMARY KEY kolom, deze kolom is de alias van de rowid kolom.

De volgende verklaring laat tabel people vallen en herschept het. Deze keer voegen we echter nog een kolom toe met de naam person_id waarvan het gegevenstype INTEGER is en kolombeperking is PRIMARY KEY :

DROP TABLE people;

CREATE TABLE people (
   person_id INTEGER PRIMARY KEY,
   first_name TEXT NOT NULL,
   last_name TEXT NOT NULL
);Code language: SQL (Structured Query Language) (sql)

Probeer het

In dit geval is de person_id kolom is eigenlijk de rowid kolom.

Hoe wijst SQLite een geheel getal toe aan de rowid kolom?

Als u de rowid . niet opgeeft waarde of u gebruikt een NULL waarde wanneer u een nieuwe rij invoegt, wijst SQLite automatisch het volgende opeenvolgende gehele getal toe, dat één groter is dan de grootste rowid in de tafel. De rowid waarde begint bij 1.

De maximale waarde van derowid kolom is 9,223,372,036,854,775,807 , die erg groot is. Als uw gegevens deze maximale waarde bereiken en u probeert een nieuwe rij in te voegen, vindt SQLite een ongebruikt geheel getal en gebruikt het. Als SQLite geen ongebruikt geheel getal kan vinden, geeft het een SQLITE_FULL fout. Bovendien, als u enkele rijen verwijdert en een nieuwe rij invoegt, zal SQLite proberen de rowid opnieuw te gebruiken waarden uit de verwijderde rijen.

Laten we er een test op doen.

Voeg eerst een rij met de maximale waarde in de people tafel.

INSERT INTO people (person_id,first_name,last_name)
VALUES(	9223372036854775807,'Johnathan','Smith');Code language: SQL (Structured Query Language) (sql)

Probeer het

Ten tweede, voeg nog een rij in zonder een waarde op te geven voor de person_id kolom:

INSERT INTO people (first_name,last_name)
VALUES('William','Gate');Code language: SQL (Structured Query Language) (sql)

Probeer het

Zoals duidelijk te zien is in de uitvoer, heeft de nieuwe rij een ongebruikt geheel getal ontvangen.

Overweeg een ander voorbeeld.

Maak eerst een nieuwe tabel met de naam t1 die één kolom heeft:

CREATE TABLE t1(c text);Code language: SQL (Structured Query Language) (sql)

Ten tweede, voeg enkele rijen toe aan de t1 tafel:

INSERT INTO t1(c) VALUES('A');
INSERT INTO t1(c) values('B');
INSERT INTO t1(c) values('C');
INSERT INTO t1(c) values('D');
Code language: SQL (Structured Query Language) (sql)

Ten derde, vraag gegevens op van de t1 tafel:

SELECT rowid, c FROM t1;Code language: SQL (Structured Query Language) (sql)

Ten vierde, verwijder alle rijen van de t1 tafel:

DELETE FROM t1;Code language: SQL (Structured Query Language) (sql)

Ten vijfde, voeg enkele rijen in de t1 . in tafel:

INSERT INTO t1(c) values('E');
INSERT INTO t1(c) values('F');
INSERT INTO t1(c) values('G');Code language: SQL (Structured Query Language) (sql)

Vraag ten slotte gegevens op van de t1 tafel:

SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)

Zoals je kunt zien, zijn de rowid 1, 2 en 3 hergebruikt voor de nieuwe rijen.

SQLite AUTOINCREMENT kolomkenmerk

SQLite raadt u aan AUTOINCREMENT . niet te gebruiken kenmerk omdat:

De AUTOINCREMENT trefwoord legt extra CPU, geheugen, schijfruimte en schijf-I/O-overhead op en moet worden vermeden als het niet strikt nodig is. Het is meestal niet nodig.

Bovendien, de manier waarop SQLite een waarde toewijst voor de AUTOINCREMENT kolom iets anders dan voor de rowid kolom.

Beschouw het volgende voorbeeld.

Laat eerst de people vallen en maak ze opnieuw tafel. Deze keer gebruiken we AUTOINCREMENT attribuutkolom:

DROP TABLE people;

CREATE TABLE people (
   person_id INTEGER PRIMARY KEY AUTOINCREMENT,
   first_name text NOT NULL,
   last_name text NOT NULL
);Code language: SQL (Structured Query Language) (sql)

Probeer het

Ten tweede, voeg een rij in met het maximum rowid waarde in de people tafel.

INSERT INTO people (person_id,first_name,last_name)
VALUES(9223372036854775807,'Johnathan','Smith');Code language: SQL (Structured Query Language) (sql)

Probeer het

Ten derde, voeg nog een rij in de people in tafel.

INSERT INTO people (first_name,last_name)
VALUES('John','Smith');Code language: SQL (Structured Query Language) (sql)

Probeer het

Deze keer gaf SQLite een foutmelding omdat de person_id kolom heeft het nummer niet opnieuw gebruikt zoals een rowid kolom.

[Err] 13 - database or disk is fullCode language: SQL (Structured Query Language) (sql)

Wanneer moet je de AUTOINCREMENT . gebruiken kolomkenmerk?

Het belangrijkste doel van het gebruik van attribuut AUTOINCREMENT is om te voorkomen dat SQLite een waarde hergebruikt die niet is gebruikt of een waarde uit de eerder verwijderde rij.

Als u geen dergelijke vereiste heeft, moet u de AUTOINCREMENT . niet gebruiken attribuut in de primaire sleutel.

In deze tutorial heb je geleerd hoe SQLite AUTOINCREMENT attribuut werkt en hoe het de manier beïnvloedt waarop SQLite waarden toewijst aan de primaire sleutelkolom.


  1. Hoe de REPLICATE()-functie werkt in SQL Server (T-SQL)

  2. Opgeslagen procedure en machtigingen - Is UITVOEREN voldoende?

  3. SQL Server FOR XML Pad maken herhalende knooppunten

  4. Hoe GRADEN() werkt in MariaDB