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

Co je to vygenerovaný sloupec?

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


  1. Levé spojení nevrací všechny řádky

  2. Příklad zřetězené funkce Oracle

  3. SQL Server TempDB Monitoring pomocí Dynamic Management Views (DMV)

  4. MySQL CAST – Jak psát Cast v MySQL