Genereret kolonneunderstøttelse blev tilføjet til SQLite i version 3.31.0, som blev frigivet den 22. januar 2020.
Genererede kolonner og beregnede kolonner er det samme. De er kolonner, hvis værdier er en funktion af andre kolonner i samme række.
I SQLite oprettes genererede kolonner ved hjælp af GENERATED AWAYS
kolonne-begrænsning ved oprettelse eller ændring af tabellen.
Der er to typer genererede kolonner; LAGET
og VIRTUEL
. Kun VIRTUAL
kolonner kan tilføjes, når en tabel ændres. Begge typer kan tilføjes, når du opretter en tabel.
Eksempel
Her er et eksempel til at demonstrere.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Hvis du får følgende fejlmeddelelse:
Error: near "AS": syntax error
Chancerne er, at du skal opgradere til en senere version af SQLite. Genererede kolonner blev kun introduceret i SQLite 3.31.0.
Lad os nu indsætte data og vælge dem.
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
Dette er et simpelt eksempel, og du kan helt sikkert bruge mere komplekse udtryk, for eksempel dem, der bruger indbyggede funktioner.
Virtuelt vs. gemt
Som standard oprettes den beregnede kolonne som en VIRTUEL
kolonne.
Du har også mulighed for at oprette en LAGET
kolonne.
Værdien af en VIRTUAL
kolonne beregnes, når den læses, hvorimod værdien af en STORED
kolonnen beregnes, når rækken skrives.
Du kan udtrykkeligt bruge VIRTUAL
eller LAGET
i din kolonnedefinition for at angive, hvilken det skal være. Hvis du udelader dette, vil det være VIRTUEL
.
Sådan kan vi ændre det forrige eksempel til at bruge en STORED
kolonne.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price) STORED
);
Uanset om det er en GEMET kolonne eller
VIRTUAL
, indtastning og valg af data er nøjagtig det samme.
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
Opdatering af data i en genereret kolonne
Du kan ikke opdatere data direkte i en beregnet kolonne. Det vil sige, at du ikke kan skrive direkte til selve den beregnede kolonne.
For at opdatere dens data skal du opdatere dataene i de underliggende kolonner, der bruges i den beregnede kolonnes udtryk.
Her er et eksempel på opdatering af de data, der blev brugt i de foregående eksempler.
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 tilgængelige hamre til 5. Dette reducerede igen den samlede værdi af hamre på lager og værdien i den genererede kolonne (TotalValue ) nedsat fra 99,99 til 49,95.