O suporte à coluna gerada foi adicionado ao SQLite na versão 3.31.0, lançada em 22 de janeiro de 2020.
Colunas geradas e colunas computadas são a mesma coisa. São colunas cujos valores são uma função de outras colunas na mesma linha.
No SQLite, as colunas geradas são criadas usando o
GENERATED ALWAYS
restrição de coluna ao criar ou alterar a tabela. Existem dois tipos de coluna gerada;
STORED
e VIRTUAL
. Apenas VIRTUAL
colunas podem ser adicionadas ao alterar uma tabela. Ambos os tipos podem ser adicionados ao criar uma tabela. Exemplo
Aqui está um exemplo para demonstrar.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Se você receber o seguinte erro:
Error: near "AS": syntax error
Provavelmente, você precisa atualizar para uma versão posterior do SQLite. As colunas geradas foram introduzidas apenas no SQLite 3.31.0.
Agora vamos inserir dados e selecioná-los.
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;
Resultado:
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
Este é um exemplo simples e você certamente pode usar expressões mais complexas, por exemplo, aquelas que usam funções internas.
Virtual x Armazenado
Por padrão, a coluna computada é criada como um
VIRTUAL
coluna. Você também tem a opção de criar um
STORED
coluna. O valor de um
VIRTUAL
coluna é computada quando lida, enquanto o valor de um STORED
coluna é computada quando a linha é escrita. Você pode usar explicitamente
VIRTUAL
ou STORED
na definição da sua coluna para indicar qual deveria ser. Se você omitir isso, será VIRTUAL
. Veja como podemos alterar o exemplo anterior para usar um
STORED
coluna. CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price) STORED
);
Independentemente de ser um
STORED
coluna ou VIRTUAL
, inserir e selecionar os dados é exatamente o mesmo. 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;
Resultado:
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
Atualizando dados em uma coluna gerada
Você não pode atualizar dados diretamente em uma coluna computada. Ou seja, você não pode escrever diretamente na própria coluna computada.
Para atualizar seus dados, você precisa atualizar os dados nas colunas subjacentes que são usadas na expressão da coluna computada.
Aqui está um exemplo de atualização dos dados usados nos exemplos anteriores.
UPDATE Products
SET Qty = 5 WHERE Id = 1;
SELECT * FROM Products;
Resultado:
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
Neste caso, reduzi o número de martelos disponíveis para 5. Isso, por sua vez, reduziu o valor total de martelos em estoque e o valor na coluna gerada (TotalValue ) reduzido de 99,99 para 49,95.