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 full
Code 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.