sql >> Database teknologi >  >> RDS >> SQLite

SQLite AUTOINCREMENT

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 fullCode 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.


  1. Sådan låser du en enkelt række

  2. Hvordan udføres SQL-forespørgsel direkte i C#?

  3. Kan ikke oprette forbindelse til postgres ved hjælp af jdbc i pyspark shell

  4. Sådan aktiverer du generelle logfiler og fejllogfiler i AWS RDS