Oversigt :i denne øvelse vil du lære om SQLite AUTOINCREMENT
kolonneattribut og hvornår den skal bruges i din tabel.
Introduktion til SQLite ROWID
tabel
Hver gang du opretter en tabel uden at angive WITHOUT ROWID
mulighed, får du en implicit auto-increment-kolonne kaldet rowid
. rowid
kolonnelager 64-bit signeret heltal, der unikt identificerer en række i tabellen.
Lad os se følgende eksempel.
Først skal du oprette en ny tabel med navnet people
der har to kolonner:first_name,
og last_name
:
CREATE TABLE people (
first_name TEXT NOT NULL,
last_name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Prøv det
For det andet skal du indsætte en række i people
tabel ved hjælp af følgende INSERT
erklæring:
INSERT INTO people (first_name, last_name)
VALUES('John', 'Doe');
Code language: SQL (Structured Query Language) (sql)
Prøv det
For det tredje, forespørg data fra people
tabel ved hjælp af følgende SELECT
erklæring:
SELECT
rowid,
first_name,
last_name
FROM
people;
Code language: SQL (Structured Query Language) (sql)
Prøv det
Som du tydeligt kan se fra outputtet, opretter SQLite implicit en kolonne ved navn rowid
og tildeler automatisk en heltalsværdi, hver gang du indsætter en ny række i tabellen.
Bemærk, at du også kan henvise til rowid
kolonne ved hjælp af dens aliaser:_rowid_
og oid
.
Når du opretter en tabel, der har en INTEGER PRIMARY KEY
kolonne, er denne kolonne alias for rowid
kolonne.
Følgende sætning fjerner tabellen people
og genskaber det. Denne gang tilføjer vi dog endnu en kolonne ved navn person_id
hvis datatype er INTEGER
og kolonnebegrænsning er 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)
Prøv det
I dette tilfælde er person_id
kolonnen er faktisk rowid
kolonne.
Hvordan tildeler SQLite en heltalsværdi til rowid
kolonne?
Hvis du ikke angiver rowid
værdi, eller du bruger en NULL
værdi, når du indsætter en ny række, tildeler SQLite automatisk det næste sekventielle heltal, som er et større end den største rowid
i bordet. rowid
værdi starter ved 1.
Den maksimale værdi af rowid
kolonne er 9,223,372,036,854,775,807
, som er meget stor. Hvis dine data når denne maksimale værdi, og du forsøger at indsætte en ny række, vil SQLite finde et ubrugt heltal og bruge det. Hvis SQLite ikke kan finde noget ubrugt heltal, vil det udstede en SQLITE_FULL
fejl. Oven i det, hvis du sletter nogle rækker og indsætter en ny række, vil SQLite forsøge at genbruge rowid
værdier fra de slettede rækker.
Lad os tage en test på det.
Først skal du indsætte en række med den maksimale værdi i people
tabel.
INSERT INTO people (person_id,first_name,last_name)
VALUES( 9223372036854775807,'Johnathan','Smith');
Code language: SQL (Structured Query Language) (sql)
Prøv det
For det andet skal du indsætte en anden række uden at angive en værdi for person_id
kolonne:
INSERT INTO people (first_name,last_name)
VALUES('William','Gate');
Code language: SQL (Structured Query Language) (sql)
Prøv det
Som det tydeligt fremgår af outputtet, modtog den nye række et ubrugt heltal.
Overvej et andet eksempel.
Først skal du oprette en ny tabel med navnet t1
der har én kolonne:
CREATE TABLE t1(c text);
Code language: SQL (Structured Query Language) (sql)
For det andet, indsæt nogle rækker i t1
tabel:
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)
For det tredje, forespørg data fra t1
tabel:
SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)
For det fjerde skal du slette alle rækker i t1
tabel:
DELETE FROM t1;
Code language: SQL (Structured Query Language) (sql)
For det femte, indsæt nogle rækker i t1
tabel:
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)
Til sidst skal du forespørge data fra t1
tabel:
SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)
Som du kan se, er række 1, 2 og 3 blevet genbrugt til de nye rækker.
SQLite AUTOINCREMENT
kolonneattribut
SQLite anbefaler, at du ikke bør bruge AUTOINCREMENT
attribut fordi:
AUTOINCREMENT
nøgleordet pålægger ekstra CPU, hukommelse, diskplads og disk I/O overhead og bør undgås, hvis det ikke er strengt nødvendigt. Det er normalt ikke nødvendigt.
Derudover den måde, SQLite tildeler en værdi til AUTOINCREMENT
kolonne en smule anderledes end måden, den gør for rowid
kolonne.
Overvej følgende eksempel.
Slip først og genskab people
bord. Denne gang bruger vi AUTOINCREMENT
attributkolonne:
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)
Prøv det
For det andet, indsæt en række med den maksimale rowid
værdi ind i people
tabel.
INSERT INTO people (person_id,first_name,last_name)
VALUES(9223372036854775807,'Johnathan','Smith');
Code language: SQL (Structured Query Language) (sql)
Prøv det
For det tredje, indsæt endnu en række i people
tabel.
INSERT INTO people (first_name,last_name)
VALUES('John','Smith');
Code language: SQL (Structured Query Language) (sql)
Prøv det
Denne gang udsendte SQLite en fejlmeddelelse, fordi person_id
kolonnen genbrugte ikke nummeret som en rowid
kolonne.
[Err] 13 - database or disk is full
Code language: SQL (Structured Query Language) (sql)
Hvornår skal du bruge AUTOINCREMENT
kolonneattribut?
Hovedformålet med at bruge attributten AUTOINCREMENT
er at forhindre SQLite i at genbruge en værdi, der ikke er blevet brugt, eller en værdi fra den tidligere slettede række.
Hvis du ikke har nogen krav som dette, bør du ikke bruge AUTOINCREMENT
attribut i den primære nøgle.
I denne øvelse har du lært, hvordan SQLite AUTOINCREMENT
attribut fungerer, og hvordan det påvirker den måde, SQLite tildeler værdier til den primære nøglekolonne.