Vissa databashanteringssystem (DBMS) inkluderar en funktion som kallas genererade kolumner.
Även kända som "beräknade kolumner", genererade kolumner liknar en normal kolumn, förutom att en genererad kolumns värde härrör från ett uttryck som beräknar värden från andra kolumner.
Med andra ord, en genererad kolumns värde beräknas från andra kolumner.
Exempel
Här är ett grundläggande exempel för att visa hur genererade kolumner fungerar.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Det här exemplet skapades i SQLite och använder SQLite-syntaxen för att skapa en genererad kolumn. Den här syntaxen använder GENERATED ALWAYS
kolumn-begränsning.
GENERATED ALWAYS
delen är valfri i SQLite, så du kan bara använda AS
.
Faktiskt, GENERATED ALWAYS
delen är också valfri i MySQL, och den är inte ens definierad i TSQL (SQL-tillägget för SQL Server), så AS
nyckelord är allt du behöver (tillsammans med det faktiska uttrycket).
Uttrycket är det som bestämmer det faktiska värdet som kolumnen kommer att hålla. I mitt exempel, delen som lyder (Qty * Price)
är uttrycket som bestämmer det värdet.
I det här fallet multiplicerar det helt enkelt kvantiteten (antal för varje produkt) med priset för varje produkt.
Därför innehåller denna genererade kolumn det totala värdet av varje lager i inventeringen.
Om vi infogar data och väljer den kan vi se det beräknade värdet för den genererade kolumnen.
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;
Resultat:
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
Om vi tittar på första raden kan vi se att det finns 10 hammare till ett pris av 9,99 styck. Den genererade kolumnen multiplicerar dessa två värden tillsammans och vi slutar med 99,9.
Om vi minskar antalet hammare, skulle den genererade kolumnen producera ett annat värde.
Här är ett exempel.
UPDATE Products
SET Qty = 5 WHERE Id = 1;
SELECT * FROM Products;
Resultat:
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
I det här fallet minskade jag antalet hammare till 5, och den genererade kolumnen beräknade därför ett värde på 49,95.
Typer av genererade kolumner
Det finns två typer av genererade kolumner; lagrade och virtuella.
Vissa DBMS kan använda något annorlunda terminologi, till exempel använder SQL Server termen "beständig" istället för "lagrad". Hur som helst, det syftar på samma sak.
VIRTUAL
:Kolumnvärden lagras inte, utan utvärderas när rader läses.STORED
:Kolumnvärden utvärderas och lagras när rader infogas eller uppdateras.
STORED
kolumner kräver därför lagringsutrymme, medan VIRTUAL
kolumner gör det inte.
Men detta betyder också att VIRTUAL
kolumner använder fler CPU-cykler när de läses.
Fördelar med genererade kolumner
Genererade kolumner kan spara tid när du skriver frågor, minska antalet fel och förbättra prestandan.
Genererade kolumner kan användas som ett sätt att förenkla och förena frågor. Ett komplext villkor kan definieras som en genererad kolumn och sedan refereras till från flera frågor i tabellen. Detta hjälper till att säkerställa att de alla använder exakt samma skick.
Lagrade genererade kolumner kan användas som en materialiserad cache för komplicerade förhållanden som är kostsamma att beräkna i farten.
Begränsningar för genererade kolumner
Genererade kolumner har vanligtvis begränsningar jämfört med vanliga kolumner, även om omfattningen av begränsningarna kan bestämmas av DBMS.
Till exempel kan genererade kolumner i allmänhet bara beräkna värden från kolumner inom samma rad. Denna begränsning kan dock övervinnas (åtminstone i SQL Server) genom att använda en användardefinierad funktion som en del av den beräknade kolumns uttryck.
Se länkarna nedan för att läsa mer om implementeringen av genererade kolumner i olika DBMS.
Officiell dokumentation
Här är dokumentationen för några populära DBMS som inkluderar begränsningarna för deras implementering av genererade kolumner:
- Räknade kolumner i SQL Server
- Genererade kolumner i PostgreSQL (version 12)
- Genererade kolumner i MySQL (version 8.0)
- Genererade kolumner i SQLite