Поддръжката на генерирани колони беше добавена към SQLite във версия 3.31.0, която беше пусната на 22 януари 2020 г.
Генерираните колони и изчислените колони са едно и също нещо. Те са колони, чиито стойности са функция на други колони в същия ред.
В SQLite генерираните колони се създават с помощта на GENERATED ALWAYS
колона-ограничение при създаване или промяна на таблицата.
Има два вида генерирани колони; STORED
и VIRTUAL
. Само VIRTUAL
колони могат да се добавят при промяна на таблица. И двата типа могат да се добавят при създаване на таблица.
Пример
Ето пример за демонстрация.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Ако получите следната грешка:
Error: near "AS": syntax error
Вероятно е, че трябва да надстроите до по-нова версия на SQLite. Генерираните колони бяха въведени само в SQLite 3.31.0.
Сега нека да вмъкнем данни и да ги изберете.
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
Това е прост пример и със сигурност можете да използвате по-сложни изрази, например такива, които използват вградени функции.
Виртуално срещу съхранено
По подразбиране изчислената колона се създава като VIRTUAL
колона.
Освен това имате възможност да създадете STORED
колона.
Стойността на VIRTUAL
колоната се изчислява при четене, докато стойността на STORED
колоната се изчислява, когато редът е написан.
Можете изрично да използвате VIRTUAL
или STORED
във вашата колона, за да посочите коя трябва да бъде. Ако пропуснете това, то ще бъде VIRTUAL
.
Ето как можем да променим предишния пример, за да използваме STORED
колона.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price) STORED
);
Независимо дали е STORED
колона или VIRTUAL
, въвеждането и избирането на данните е абсолютно същото.
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
Актуализиране на данни в генерирана колона
Не можете да актуализирате данните директно в изчислена колона. Тоест, не можете да пишете директно в самата изчислена колона.
За да актуализирате неговите данни, трябва да актуализирате данните в основните колони, които се използват в израза на изчислената колона.
Ето пример за актуализиране на данните, използвани в предишните примери.
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. Това от своя страна намали общата стойност на чуковете на склад и стойността в генерираната колона (TotalValue ) намален от 99,99 на 49,95.