Ondersteuning voor gegenereerde kolommen is toegevoegd aan SQLite in versie 3.31.0, die werd uitgebracht op 22 januari 2020.
Gegenereerde kolommen en berekende kolommen zijn hetzelfde. Het zijn kolommen waarvan de waarden een functie zijn van andere kolommen in dezelfde rij.
In SQLite worden gegenereerde kolommen gemaakt met de GENERATED ALWAYS
kolombeperking bij het maken of wijzigen van de tabel.
Er zijn twee soorten gegenereerde kolommen; STORED
en VIRTUAL
. Alleen VIRTUAL
kolommen kunnen worden toegevoegd bij het wijzigen van een tabel. Beide typen kunnen worden toegevoegd bij het maken van een tabel.
Voorbeeld
Hier is een voorbeeld om te demonstreren.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Als u de volgende foutmelding krijgt:
Error: near "AS": syntax error
De kans is groot dat u moet upgraden naar een latere versie van SQLite. Gegenereerde kolommen zijn alleen geïntroduceerd in SQLite 3.31.0.
Laten we nu gegevens invoegen en selecteren.
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;
Resultaat:
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
Dit is een eenvoudig voorbeeld en je kunt zeker complexere uitdrukkingen gebruiken, bijvoorbeeld die met ingebouwde functies.
Virtueel versus opgeslagen
Standaard wordt de berekende kolom gemaakt als een VIRTUAL
kolom.
Je hebt ook de mogelijkheid om een STORED
. aan te maken kolom.
De waarde van een VIRTUAL
kolom wordt berekend wanneer deze wordt gelezen, terwijl de waarde van een STORED
kolom wordt berekend wanneer de rij wordt geschreven.
U kunt expliciet VIRTUAL
. gebruiken of STORED
in uw kolomdefinitie om aan te geven welke het moet zijn. Als je dit weglaat, wordt het VIRTUAL
.
Hier is hoe we het vorige voorbeeld kunnen wijzigen om een STORED
. te gebruiken kolom.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price) STORED
);
Ongeacht of het een STORED
. is kolom of VIRTUAL
, het invoeren en selecteren van de gegevens is precies hetzelfde.
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;
Resultaat:
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
Gegevens bijwerken in een gegenereerde kolom
U kunt gegevens niet rechtstreeks in een berekende kolom bijwerken. Dat wil zeggen, u kunt niet rechtstreeks naar de berekende kolom zelf schrijven.
Om de gegevens bij te werken, moet u de gegevens bijwerken in de onderliggende kolommen die worden gebruikt in de uitdrukking van de berekende kolom.
Hier is een voorbeeld van het bijwerken van de gegevens die in de vorige voorbeelden zijn gebruikt.
UPDATE Products
SET Qty = 5 WHERE Id = 1;
SELECT * FROM Products;
Resultaat:
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
In dit geval heb ik het aantal beschikbare hamers teruggebracht tot 5. Dit verminderde op zijn beurt de totale waarde van de hamers in voorraad en de waarde in de gegenereerde kolom (TotalValue ) verlaagd van 99,99 naar 49,95.