Някои системи за управление на бази данни (СУБД) включват функция, наречена генерирани колони.
Известни също като „изчислени колони“, генерираните колони са подобни на нормална колона, с изключение на това, че стойността на генерираната колона се извлича от израз, който изчислява стойности от други колони.
С други думи, стойността на генерираната колона се изчислява от други колони.
Пример
Ето основен пример, за да демонстрирате как работят генерираните колони.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Този пример е създаден в SQLite и използва синтаксиса на SQLite за създаване на генерирана колона. Този синтаксис използва GENERATED ALWAYS
колона-ограничение.
GENERATED ALWAYS
частта е по избор в SQLite, така че можете просто да използвате AS
.
Всъщност GENERATED ALWAYS
частта също е по избор в MySQL и дори не е дефинирана в TSQL (разширението на SQL за SQL Server), така че AS
ключова дума е всичко, от което се нуждаете (заедно с действителния израз).
Изразът е това, което определя действителната стойност, която колоната ще съдържа. В моя пример частта, която гласи (Qty * Price)
е изразът, който определя тази стойност.
В този случай това е просто умножаване на количеството (броя на всеки продукт) с цената на всеки продукт.
Следователно тази генерирана колона съдържа общата стойност на всяка наличност в инвентара.
Ако вмъкнем данни и ги изберем, можем да видим изчислената стойност на генерираната колона.
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;
Резултат:
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
Ако погледнем първия ред, можем да видим, че има 10 чука на цена от 9,99 всеки. Генерираната колона умножава тези две стойности заедно и в крайна сметка получаваме 99.9.
Ако намалим броя на чуковете, тогава генерираната колона ще произведе различна стойност.
Ето един пример.
UPDATE Products
SET Qty = 5 WHERE Id = 1;
SELECT * FROM Products;
Резултат:
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
В този случай намалих броя на чуковете до 5 и генерираната колона следователно изчисли стойност от 49,95.
Типове генерирани колони
Има два вида генерирани колони; съхранени и виртуални.
Някои СУБД могат да използват малко по-различна терминология, например SQL Server използва термина „постоянен“ вместо „съхранен“. Така или иначе се отнася до едно и също нещо.
VIRTUAL
:Стойностите на колоните не се съхраняват, но се оценяват при четене на редове.STORED
:Стойностите на колоните се оценяват и съхраняват при вмъкване или актуализиране на редове.
STORED
Следователно колоните изискват място за съхранение, докато VIRTUAL
колоните не.
Това обаче също означава, че VIRTUAL
колоните използват повече цикли на процесора, когато се четат.
Предимства на генерираните колони
Генерираните колони могат да спестят време при писане на заявки, да намалят грешките и да подобрят производителността.
Генерираните колони могат да се използват като начин за опростяване и унифициране на заявките. Сложно условие може да се дефинира като генерирана колона и след това да се препраща от множество заявки в таблицата. Това помага да се гарантира, че всички те използват точно едно и също условие.
Съхранените генерирани колони могат да се използват като материализиран кеш за сложни условия, които са скъпи за изчисляване в движение.
Ограничения на генерираните колони
Генерираните колони обикновено идват с ограничения в сравнение с нормалните колони, въпреки че степента на ограниченията може да бъде определена от СУБД.
Например генерираните колони обикновено могат да изчисляват стойности само от колони в един и същи ред. Това ограничение обаче може да бъде преодоляно (поне в SQL Server) чрез използване на дефинирана от потребителя функция като част от израза на изчислената колона.
Вижте връзките по-долу, за да прочетете повече за внедряването на генерирани колони в различни СУБД.
Официална документация
Ето документацията за някои популярни СУБД, която включва ограниченията на тяхното внедряване на генерирани колони:
- Изчислени колони в SQL Server
- Генерирани колони в PostgreSQL (версия 12)
- Генерирани колони в MySQL (Версия 8.0)
- Генерирани колони в SQLite