sql >> Databáze >  >> RDS >> SQLite

SQLite AUTOINCREMENT

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


  1. Použití INSERT s databází PostgreSQL pomocí Pythonu

  2. Jak mohu optimalizovat funkci ORDER BY RAND() MySQL?

  3. Mapování cizího klíče s vlastním názvem sloupce

  4. Jak přidat indikátor AD/BC k datu v Oracle