Niektóre systemy zarządzania bazami danych (DBMS) zawierają funkcję zwaną generowanymi kolumnami.
Nazywane również „kolumnami wyliczanymi”, kolumny generowane są podobne do zwykłej kolumny, z wyjątkiem tego, że wartość kolumny generowanej pochodzi z wyrażenia, które oblicza wartości z innych kolumn.
Innymi słowy, wartość wygenerowanej kolumny jest obliczana z innych kolumn.
Przykład
Oto podstawowy przykład pokazujący, jak działają wygenerowane kolumny.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Ten przykład został utworzony w SQLite i używa składni SQLite do tworzenia wygenerowanej kolumny. Ta składnia używa GENERATED ALWAYS
wiązanie-kolumny.
GENERATED ALWAYS
część jest opcjonalna w SQLite, więc możesz po prostu użyć AS
.
Właściwie GENERATED ALWAYS
część jest również opcjonalna w MySQL i nie jest nawet zdefiniowana w TSQL (rozszerzenie SQL dla SQL Server), więc AS
słowo kluczowe to wszystko, czego potrzebujesz (wraz z rzeczywistym wyrażeniem).
Wyrażenie określa rzeczywistą wartość, którą będzie przechowywać kolumna. W moim przykładzie część, która czyta (Qty * Price)
jest wyrażeniem, które określa tę wartość.
W tym przypadku jest to po prostu pomnożenie ilości (liczby każdego produktu) przez cenę każdego produktu.
Dlatego ta wygenerowana kolumna zawiera całkowitą wartość każdego towaru w ekwipunku.
Jeśli wstawimy dane i je zaznaczymy, możemy zobaczyć obliczoną wartość wygenerowanej kolumny.
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
Jeśli spojrzymy na pierwszy rząd, zobaczymy, że jest 10 młotków w cenie 9,99 każdy. Wygenerowana kolumna mnoży te dwie wartości razem i otrzymujemy 99,9.
Jeśli zmniejszymy liczbę młotków, generowana kolumna da inną wartość.
Oto przykład.
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ę młotków do 5, a wygenerowana kolumna obliczyła zatem wartość 49,95.
Rodzaje generowanych kolumn
Istnieją dwa rodzaje generowanych kolumn; przechowywane i wirtualne.
Niektóre DBMS mogą używać nieco innej terminologii, na przykład SQL Server używa terminu „trwałe” zamiast „przechowywane”. Tak czy inaczej, odnosi się do tego samego.
VIRTUAL
:Wartości kolumn nie są przechowywane, ale są oceniane podczas odczytywania wierszy.STORED
:Wartości kolumn są oceniane i przechowywane, gdy wiersze są wstawiane lub aktualizowane.
STORED
kolumny wymagają zatem miejsca do przechowywania, podczas gdy VIRTUAL
kolumny nie.
Oznacza to jednak również, że VIRTUAL
kolumny zużywają więcej cykli procesora podczas odczytu.
Zalety generowanych kolumn
Wygenerowane kolumny mogą zaoszczędzić czas podczas pisania zapytań, zmniejszyć liczbę błędów i poprawić wydajność.
Wygenerowane kolumny mogą służyć jako sposób na uproszczenie i ujednolicenie zapytań. Złożony warunek można zdefiniować jako wygenerowaną kolumnę, a następnie odnieść się do niej z wielu zapytań w tabeli. Pomaga to zapewnić, że wszystkie stosują dokładnie ten sam warunek.
Przechowywane wygenerowane kolumny mogą być używane jako zmaterializowana pamięć podręczna w przypadku skomplikowanych warunków, których obliczanie w locie jest kosztowne.
Ograniczenia generowanych kolumn
Wygenerowane kolumny zazwyczaj mają ograniczenia w porównaniu z normalnymi kolumnami, chociaż zakres ograniczeń może być określony przez DBMS.
Na przykład wygenerowane kolumny są zazwyczaj zdolne do obliczania wartości tylko z kolumn w tym samym wierszu. Jednak to ograniczenie można pokonać (przynajmniej w SQL Server), używając funkcji zdefiniowanej przez użytkownika jako części wyrażenia kolumny wyliczanej.
Zobacz poniższe linki, aby przeczytać więcej o implementacji generowanych kolumn w różnych DBMS.
Oficjalna dokumentacja
Oto dokumentacja niektórych popularnych DBMS, która zawiera ograniczenia ich implementacji generowanych kolumn:
- Kolumny obliczane w SQL Server
- Wygenerowane kolumny w PostgreSQL (wersja 12)
- Wygenerowane kolumny w MySQL (wersja 8.0)
- Wygenerowane kolumny w SQLite