Shrnutí :v tomto tutoriálu se dozvíte o SQLite AUTOINCREMENT
sloupec atribut a kdy jej použít ve vaší tabulce.
Úvod do SQLite ROWID
tabulka
Kdykoli vytvoříte tabulku bez určení WITHOUT ROWID
možnost, získáte implicitní sloupec automatického zvýšení s názvem rowid
. rowid
column store 64bitové celé číslo se znaménkem, které jednoznačně identifikuje řádek v tabulce.
Podívejme se na následující příklad.
Nejprve vytvořte novou tabulku s názvem people
který má dva sloupce:first_name,
a last_name
:
CREATE TABLE people (
first_name TEXT NOT NULL,
last_name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Zkuste to
Za druhé, vložte řádek do people
pomocí následujícího INSERT
prohlášení:
INSERT INTO people (first_name, last_name)
VALUES('John', 'Doe');
Code language: SQL (Structured Query Language) (sql)
Zkuste to
Za třetí, dotazujte se na data od people
pomocí následujícího SELECT
prohlášení:
SELECT
rowid,
first_name,
last_name
FROM
people;
Code language: SQL (Structured Query Language) (sql)
Zkuste to
Jak můžete jasně vidět z výstupu, SQLite implicitně vytváří sloupec s názvem rowid
a automaticky přiřadí celočíselnou hodnotu vždy, když do tabulky vložíte nový řádek.
Všimněte si, že můžete také odkazovat na rowid
sloupec pomocí svých aliasů:_rowid_
a oid
.
Když vytvoříte tabulku, která má INTEGER PRIMARY KEY
Tento sloupec je alias rowid
sloupec.
Následující příkaz vypustí tabulku people
a znovu ho vytvoří. Tentokrát však přidáváme další sloupec s názvem person_id
jehož datový typ je INTEGER
a omezení sloupce je 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)
Zkuste to
V tomto případě person_id
sloupec je ve skutečnosti rowid
sloupec.
Jak SQLite přiřadí celočíselnou hodnotu rowid
sloupec?
Pokud nezadáte rowid
nebo použijete NULL
když vložíte nový řádek, SQLite automaticky přiřadí další sekvenční celé číslo, které je o jedno větší než největší rowid
ve stole. rowid
hodnota začíná na 1.
Maximální hodnota rowid
sloupec je 9,223,372,036,854,775,807
, která je velmi velká. Pokud vaše data dosáhnou této maximální hodnoty a pokusíte se vložit nový řádek, SQLite najde nepoužité celé číslo a použije ho. Pokud SQLite nemůže najít žádné nepoužité celé číslo, vydá SQLITE_FULL
chyba. Navíc, pokud smažete některé řádky a vložíte nový řádek, SQLite se pokusí znovu použít rowid
hodnoty z odstraněných řádků.
Pojďme si to otestovat.
Nejprve vložte do people
řádek s maximální hodnotou tabulka.
INSERT INTO people (person_id,first_name,last_name)
VALUES( 9223372036854775807,'Johnathan','Smith');
Code language: SQL (Structured Query Language) (sql)
Zkuste to
Za druhé vložte další řádek bez zadání hodnoty pro person_id
sloupec:
INSERT INTO people (first_name,last_name)
VALUES('William','Gate');
Code language: SQL (Structured Query Language) (sql)
Zkuste to
Jak jasně ukazuje výstup, nový řádek obdržel nepoužité celé číslo.
Zvažte jiný příklad.
Nejprve vytvořte novou tabulku s názvem t1
který má jeden sloupec:
CREATE TABLE t1(c text);
Code language: SQL (Structured Query Language) (sql)
Za druhé, vložte několik řádků do t1
tabulka:
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)
Za třetí, dotazujte se na data z t1
tabulka:
SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)
Za čtvrté, odstraňte všechny řádky t1
tabulka:
DELETE FROM t1;
Code language: SQL (Structured Query Language) (sql)
Za páté, vložte několik řádků do t1
tabulka:
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)
Nakonec zadejte dotaz na data z t1
tabulka:
SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)
Jak můžete vidět, rowid 1, 2 a 3 byly znovu použity pro nové řádky.
SQLite AUTOINCREMENT
atribut sloupce
SQLite doporučuje, abyste nepoužívali AUTOINCREMENT
atribut protože:
AUTOINCREMENT
Klíčové slovo vyžaduje extra režii CPU, paměti, místa na disku a diskových I/O a je třeba se mu vyhnout, pokud to není nezbytně nutné. Obvykle to není potřeba.
Navíc způsob, jakým SQLite přiřazuje hodnotu pro AUTOINCREMENT
mírně odlišný od způsobu, jakým je tomu u rowid
sloupec.
Zvažte následující příklad.
Nejprve vypusťte a znovu vytvořte people
stůl. Tentokrát používáme AUTOINCREMENT
sloupec atributu:
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)
Zkuste to
Za druhé, vložte řádek s maximálním rowid
hodnotu do people
tabulka.
INSERT INTO people (person_id,first_name,last_name)
VALUES(9223372036854775807,'Johnathan','Smith');
Code language: SQL (Structured Query Language) (sql)
Zkuste to
Za třetí vložte další řádek do people
tabulka.
INSERT INTO people (first_name,last_name)
VALUES('John','Smith');
Code language: SQL (Structured Query Language) (sql)
Zkuste to
Tentokrát SQLite vydalo chybovou zprávu, protože person_id
sloupec znovu nepoužil číslo jako rowid
sloupec.
[Err] 13 - database or disk is full
Code language: SQL (Structured Query Language) (sql)
Kdy byste měli použít AUTOINCREMENT
atribut sloupce?
Hlavním účelem použití atributu AUTOINCREMENT
je zabránit SQLite v opětovném použití hodnoty, která nebyla použita, nebo hodnoty z dříve smazaného řádku.
Pokud žádný takový požadavek nemáte, neměli byste používat AUTOINCREMENT
atribut v primárním klíči.
V tomto tutoriálu jste se naučili, jak SQLite AUTOINCREMENT
atribut funguje a jak ovlivňuje způsob, jakým SQLite přiřazuje hodnoty sloupci primárního klíče.