Nogle databasestyringssystemer (DBMS'er) indeholder en funktion kaldet genererede kolonner.
Også kendt som "beregnede kolonner", genererede kolonner ligner en normal kolonne, bortset fra at en genereret kolonnes værdi er afledt af et udtryk, der beregner værdier fra andre kolonner.
Med andre ord, en genereret kolonnes værdi beregnes ud fra andre kolonner.
Eksempel
Her er et grundlæggende eksempel for at demonstrere, hvordan genererede kolonner fungerer.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Dette eksempel blev oprettet i SQLite og bruger SQLite-syntaksen til at oprette en genereret kolonne. Denne syntaks bruger GENERATED ALWAYS
kolonne-begrænsning.
GENERATED ALWAYS
del er valgfri i SQLite, så du kan bare bruge AS
.
Faktisk er GENERATED ALWAYS
del er også valgfri i MySQL, og den er ikke engang defineret i TSQL (SQL-udvidelsen til SQL Server), så AS
søgeord er alt hvad du behøver (sammen med det faktiske udtryk).
Udtrykket er det, der bestemmer den faktiske værdi, som kolonnen vil indeholde. I mit eksempel er den del, der lyder (Qty * Price)
er det udtryk, der bestemmer denne værdi.
I dette tilfælde multiplicerer det blot mængden (antal på hvert produkt) med prisen på hvert produkt.
Derfor indeholder denne genererede kolonne den samlede værdi af hver bestand i beholdningen.
Hvis vi indsætter data og vælger dem, kan vi se den beregnede værdi af den genererede kolonne.
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
Hvis vi ser på første række, kan vi se, at der er 10 hamre til en pris af 9,99 pr. Den genererede kolonne multiplicerer disse to værdier sammen, og vi ender med 99,9.
Hvis vi reducerer antallet af hamre, vil den genererede kolonne producere en anden værdi.
Her er et eksempel.
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 dette tilfælde reducerede jeg antallet af hamre til 5, og den genererede kolonne beregnede derfor en værdi på 49,95.
Typer af genererede kolonner
Der er to typer genererede kolonner; lagret og virtuelt.
Nogle DBMS'er kan bruge lidt anderledes terminologi, for eksempel bruger SQL Server udtrykket "vedvarende" i stedet for "lagret". Uanset hvad, henviser det til det samme.
VIRTUAL
:Kolonneværdier gemmes ikke, men evalueres, når rækker læses.STORED
:Kolonneværdier evalueres og gemmes, når rækker indsættes eller opdateres.
STORED
kolonner kræver derfor lagerplads, hvorimod VIRTUAL
kolonner ikke.
Dette betyder dog også, at VIRTUAL
kolonner bruger flere CPU-cyklusser, når de læses.
Fordele ved genererede kolonner
Genererede kolonner kan spare tid, når du skriver forespørgsler, reducere fejl og forbedre ydeevnen.
Genererede kolonner kan bruges som en måde at forenkle og forene forespørgsler. En kompleks betingelse kan defineres som en genereret kolonne og derefter henvises til fra flere forespørgsler i tabellen. Dette er med til at sikre, at de alle bruger nøjagtig den samme tilstand.
Lagrede genererede kolonner kan bruges som en materialiseret cache til komplicerede forhold, der er dyre at beregne på et øjeblik.
Begrænsninger for genererede kolonner
Genererede kolonner har generelt begrænsninger sammenlignet med normale kolonner, selvom omfanget af begrænsningerne kan bestemmes af DBMS.
For eksempel er genererede kolonner generelt kun i stand til at beregne værdier fra kolonner i samme række. Denne begrænsning kan dog overvindes (i hvert fald i SQL Server) ved at bruge en brugerdefineret funktion som en del af den beregnede kolonnes udtryk.
Se nedenstående links for at læse mere om implementeringen af genererede kolonner i forskellige DBMS'er.
Officiel dokumentation
Her er dokumentationen for nogle populære DBMS'er, der inkluderer begrænsningerne for deres implementering af genererede kolonner:
- Beregnet kolonner i SQL Server
- Genererede kolonner i PostgreSQL (version 12)
- Genererede kolonner i MySQL (version 8.0)
- Genereret kolonner i SQLite