Alguns sistemas de gerenciamento de banco de dados (DBMSs) incluem um recurso chamado colunas geradas.
Também conhecidas como “colunas computadas”, as colunas geradas são semelhantes a uma coluna normal, exceto que o valor de uma coluna gerada é derivado de uma expressão que calcula valores de outras colunas.
Em outras palavras, o valor de uma coluna gerada é calculado a partir de outras colunas.
Exemplo
Aqui está um exemplo básico para demonstrar como as colunas geradas funcionam.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Este exemplo foi criado no SQLite e usa a sintaxe SQLite para criar uma coluna gerada. Esta sintaxe usa o
GENERATED ALWAYS
restrição de coluna. O
GENERATED ALWAYS
parte é opcional no SQLite, então você pode usar apenas AS
. Na verdade, o
GENERATED ALWAYS
parte também é opcional no MySQL, e nem é definida no TSQL (a extensão SQL para SQL Server), então o AS
palavra-chave é tudo que você precisa (junto com a expressão real). A expressão é o que determina o valor real que a coluna conterá. No meu exemplo, a parte que lê
(Qty * Price)
é a expressão que determina esse valor. Neste caso, é simplesmente multiplicar a quantidade (número de cada produto) pelo preço de cada produto.
Portanto, esta coluna gerada contém o valor total de cada estoque no estoque.
Se inserirmos dados e os selecionarmos, podemos ver o valor calculado da coluna gerada.
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
Se olharmos para a primeira linha, podemos ver que existem 10 martelos a um preço de 9,99 cada. A coluna gerada multiplica esses dois valores juntos e acabamos com 99,9.
Se reduzirmos o número de martelos, a coluna gerada produziria um valor diferente.
Aqui está um exemplo.
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 para 5, e a coluna gerada, portanto, calculou um valor de 49,95.
Tipos de colunas geradas
Existem dois tipos de colunas geradas; armazenados e virtuais.
Alguns DBMSs podem usar terminologia ligeiramente diferente, por exemplo, o SQL Server usa o termo “persistente” em vez de “armazenado”. De qualquer forma, refere-se à mesma coisa.
VIRTUAL
:os valores das colunas não são armazenados, mas são avaliados quando as linhas são lidas.STORED
:os valores das colunas são avaliados e armazenados quando as linhas são inseridas ou atualizadas.
STORED
colunas, portanto, requer espaço de armazenamento, enquanto VIRTUAL
colunas não. No entanto, isso também significa que
VIRTUAL
colunas usam mais ciclos de CPU ao serem lidas. Benefícios das Colunas Geradas
As colunas geradas podem economizar tempo ao escrever consultas, reduzir erros e melhorar o desempenho.
As colunas geradas podem ser usadas como forma de simplificar e unificar as consultas. Uma condição complexa pode ser definida como uma coluna gerada e referenciada em várias consultas na tabela. Isso ajuda a garantir que todos usem exatamente a mesma condição.
As colunas geradas armazenadas podem ser usadas como um cache materializado para condições complicadas que são caras para calcular em tempo real.
Limitações de Colunas Geradas
As colunas geradas geralmente apresentam limitações quando comparadas às colunas normais, embora a extensão das limitações possa ser determinada pelo SGBD.
Por exemplo, as colunas geradas geralmente só conseguem calcular valores de colunas dentro da mesma linha. No entanto, essa limitação pode ser superada (pelo menos no SQL Server) usando uma função definida pelo usuário como parte da expressão da coluna computada.
Veja os links abaixo para ler mais sobre a implementação de colunas geradas em vários SGBDs.
Documentação oficial
Aqui está a documentação de alguns DBMSs populares que incluem as limitações de sua implementação de colunas geradas:
- Colunas computadas no SQL Server
- Colunas geradas no PostgreSQL (versão 12)
- Colunas geradas no MySQL (versão 8.0)
- Colunas geradas no SQLite