Některé systémy správy databází (DBMS) obsahují funkci nazývanou generované sloupce.
Vygenerované sloupce, známé také jako „počítané sloupce“, jsou podobné normálnímu sloupci, s tím rozdílem, že hodnota vygenerovaného sloupce je odvozena z výrazu, který počítá hodnoty z jiných sloupců.
Jinými slovy, hodnota vygenerovaného sloupce se vypočítává z jiných sloupců.
Příklad
Zde je základní příklad, který demonstruje, jak fungují generované sloupce.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Tento příklad byl vytvořen v SQLite a používá syntaxi SQLite pro vytvoření generovaného sloupce. Tato syntaxe používá GENERATED ALWAYS
sloupcové omezení.
GENERATED ALWAYS
část je v SQLite volitelná, takže stačí použít AS
.
Vlastně GENERATED ALWAYS
část je také volitelná v MySQL a není dokonce definována v TSQL (rozšíření SQL pro SQL Server), takže AS
klíčové slovo je vše, co potřebujete (společně se skutečným výrazem).
Výraz je to, co určuje skutečnou hodnotu, kterou bude sloupec obsahovat. V mém příkladu část, která zní (Qty * Price)
je výraz, který určuje tuto hodnotu.
V tomto případě jde jednoduše o vynásobení množství (čísla každého produktu) cenou každého produktu.
Proto tento vygenerovaný sloupec obsahuje celkovou hodnotu každé zásoby v inventáři.
Pokud vložíme data a vybereme je, můžeme vidět vypočítanou hodnotu vygenerovaného sloupce.
INSERT INTO Products VALUES
(1, 'Hammer', 10, 9.99),
(2, 'Saw', 5, 11.34),
(3, 'Wrench', 7, 37.00),
(4, 'Chisel', 9, 23.00),
(5, 'Bandage', 70, 120.00);
SELECT * FROM Products;
Výsledek:
Id Name Qty Price TotalValue ----- ---------- ----- ------ ---------- 1 Hammer 10 9.99 99.9 2 Saw 5 11.34 56.7 3 Wrench 7 37 259 4 Chisel 9 23 207 5 Bandage 70 120 8400
Když se podíváme na první řadu, vidíme, že je tam 10 kladívek v ceně 9,99 za kus. Vygenerovaný sloupec tyto dvě hodnoty vynásobí dohromady a dostaneme 99,9.
Pokud snížíme počet kladívek, vygenerovaný sloupec by produkoval jinou hodnotu.
Zde je příklad.
UPDATE Products
SET Qty = 5 WHERE Id = 1;
SELECT * FROM Products;
Výsledek:
Id Name Qty Price TotalValue ----- ---------- ----- ------ ---------- 1 Hammer 5 9.99 49.95 2 Saw 5 11.34 56.7 3 Wrench 7 37 259 4 Chisel 9 23 207 5 Bandage 70 120 8400
V tomto případě jsem snížil počet kladívek na 5 a vygenerovaný sloupec tedy vypočítal hodnotu 49,95.
Typy generovaných sloupců
Existují dva typy generovaných sloupců; uložené a virtuální.
Některé DBMS mohou používat mírně odlišnou terminologii, například SQL Server používá termín „trvalý“ místo „uložený“. V každém případě odkazuje na stejnou věc.
VIRTUAL
:Hodnoty sloupců se neukládají, ale vyhodnocují se při čtení řádků.STORED
:Hodnoty sloupců se vyhodnocují a ukládají při vkládání nebo aktualizaci řádků.
STORED
sloupce proto vyžadují úložný prostor, zatímco VIRTUAL
sloupce ne.
To však také znamená, že VIRTUAL
sloupce využívají při čtení více cyklů CPU.
Výhody generovaných sloupců
Generované sloupce mohou ušetřit čas při psaní dotazů, snížit chyby a zlepšit výkon.
Generované sloupce lze použít jako způsob, jak zjednodušit a sjednotit dotazy. Složitou podmínku lze definovat jako vygenerovaný sloupec a poté na ni odkazovat z více dotazů v tabulce. To pomáhá zajistit, že všechny používají přesně stejnou podmínku.
Uložené vygenerované sloupce lze použít jako materializovanou mezipaměť pro komplikované podmínky, jejichž výpočet za běhu je nákladný.
Omezení vygenerovaných sloupců
Generované sloupce obecně přicházejí s omezeními ve srovnání s normálními sloupci, i když rozsah omezení může určit DBMS.
Například vygenerované sloupce jsou obecně schopny vypočítat hodnoty pouze ze sloupců ve stejném řádku. Toto omezení však lze překonat (alespoň v SQL Serveru) použitím uživatelsky definované funkce jako součásti výrazu vypočítaného sloupce.
Další informace o implementaci generovaných sloupců v různých DBMS naleznete na níže uvedených odkazech.
Oficiální dokumentace
Zde je dokumentace pro některé populární DBMS, která zahrnuje omezení jejich implementace generovaných sloupců:
- Vypočítané sloupce na serveru SQL Server
- Generované sloupce v PostgreSQL (verze 12)
- Generované sloupce v MySQL (verze 8.0)
- Generované sloupce v SQLite