Genererat kolumnstöd lades till i SQLite i version 3.31.0, som släpptes den 22 januari 2020.
Genererade kolumner och beräknade kolumner är samma sak. De är kolumner vars värden är en funktion av andra kolumner i samma rad.
I SQLite skapas genererade kolumner med GENERATED ALWAYS
kolumnbegränsning när du skapar eller ändrar tabellen.
Det finns två typer av genererade kolumner; STORED
och VIRTUAL
. Endast VIRTUAL
kolumner kan läggas till när du ändrar en tabell. Båda typerna kan läggas till när du skapar en tabell.
Exempel
Här är ett exempel att visa.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Om du får följande felmeddelande:
Error: near "AS": syntax error
Chansen är stor att du behöver uppgradera till en senare version av SQLite. Genererade kolumner introducerades endast i SQLite 3.31.0.
Låt oss nu infoga data och välja den.
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
Detta är ett enkelt exempel och du kan säkert använda mer komplexa uttryck, till exempel sådana som använder inbyggda funktioner.
Virtuellt kontra lagrat
Som standard skapas den beräknade kolumnen som en VIRTUAL
kolumn.
Du har också möjlighet att skapa en STORED
kolumn.
Värdet på en VIRTUAL
kolumn beräknas när den läses, medan värdet på en STORED
kolumnen beräknas när raden skrivs.
Du kan uttryckligen använda VIRTUAL
eller STORED
i din kolumndefinition för att ange vilken det ska vara. Om du utelämnar detta blir det VIRTUAL
.
Så här kan vi ändra det tidigare exemplet till att använda en STORED
kolumn.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price) STORED
);
Oavsett om det är en STORED
kolumn eller VIRTUAL
, inmatning och val av data är exakt densamma.
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
Uppdatera data i en genererad kolumn
Du kan inte uppdatera data direkt i en beräknad kolumn. Det vill säga, du kan inte skriva direkt till själva den beräknade kolumnen.
För att uppdatera dess data måste du uppdatera data i de underliggande kolumnerna som används i den beräknade kolumnens uttryck.
Här är ett exempel på uppdatering av data som användes i de tidigare exemplen.
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 tillgängliga hammare till 5. Detta minskade i sin tur det totala värdet av hammare i lager och värdet i den genererade kolumnen (TotalValue ) sänkt från 99,99 till 49,95.