Obsługa wygenerowanych kolumn została dodana do SQLite w wersji 3.31.0, która została wydana 22 stycznia 2020 r.
Kolumny generowane i kolumny obliczane to to samo. Są to kolumny, których wartości są funkcją innych kolumn w tym samym wierszu.
W SQLite generowane kolumny są tworzone przy użyciu GENERATED ALWAYS
ograniczenie kolumn podczas tworzenia lub modyfikowania tabeli.
Istnieją dwa rodzaje generowanej kolumny; STORED
i VIRTUAL
. Tylko VIRTUAL
kolumny można dodawać podczas zmiany tabeli. Oba typy można dodać podczas tworzenia tabeli.
Przykład
Oto przykład do zademonstrowania.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Jeśli pojawi się następujący błąd:
Error: near "AS": syntax error
Możliwe, że musisz uaktualnić do nowszej wersji SQLite. Wygenerowane kolumny zostały wprowadzone tylko w SQLite 3.31.0.
Teraz wstawiamy dane i wybieramy je.
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;
Wynik:
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
To jest prosty przykład i z pewnością możesz użyć bardziej złożonych wyrażeń, na przykład takich, które używają wbudowanych funkcji.
Wirtualne a przechowywane
Domyślnie obliczona kolumna jest tworzona jako VIRTUAL
kolumna.
Masz również możliwość utworzenia STORED
kolumna.
Wartość VIRTUAL
kolumna jest obliczana podczas odczytu, podczas gdy wartość STORED
kolumna jest obliczana podczas zapisywania wiersza.
Możesz jawnie użyć VIRTUAL
lub STORED
w definicji kolumny, aby wskazać, która powinna być. Jeśli to pominiesz, będzie to VIRTUAL
.
Oto jak możemy zmienić poprzedni przykład, aby używał STORED
kolumna.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price) STORED
);
Niezależnie od tego, czy jest to STORED
kolumna lub VIRTUAL
, wprowadzanie i wybieranie danych jest dokładnie takie samo.
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;
Wynik:
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
Aktualizacja danych w wygenerowanej kolumnie
Nie można aktualizować danych bezpośrednio w kolumnie wyliczanej. Oznacza to, że nie możesz pisać bezpośrednio do samej kolumny obliczeniowej.
Aby zaktualizować jego dane, musisz zaktualizować dane w podstawowych kolumnach, które są używane w wyrażeniu kolumny wyliczanej.
Oto przykład aktualizacji danych użytych w poprzednich przykładach.
UPDATE Products
SET Qty = 5 WHERE Id = 1;
SELECT * FROM Products;
Wynik:
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
W tym przypadku zmniejszyłem liczbę dostępnych młotów do 5. To z kolei zmniejszyło całkowitą wartość młotków w magazynie i wartość w wygenerowanej kolumnie (TotalValue ) zmniejszono z 99,99 do 49,95.