Resumo : neste tutorial, você aprenderá sobre as colunas geradas pelo SQLite.
Introdução às colunas geradas pelo SQLite
SQLite introduziu as colunas geradas desde a versão 3.31.0.
Por definição, colunas geradas são as colunas de uma tabela cujos valores são derivados de uma expressão que envolve outras colunas da mesma tabela.
As colunas geradas também são conhecidas como colunas computadas.
Para definir uma coluna gerada, use a GENERATED ALWAYS
sintaxe de restrição de coluna da seguinte forma:
column_name data_type
[GENERATED ALWAYS] AS expression
[VIRTUAL | STORED]
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Nesta sintaxe, você especifica o expression
que calcula os valores column_name
após as GENERATED ALWAYS
palavras-chave. Normalmente expression
envolve colunas da mesma linha na mesma tabela.
As GENERATED ALWAYS
palavras-chave são opcionais. Portanto, você pode torná-lo mais curto da seguinte maneira:
column_name data_type AS expression [VIRTUAL | STORED]
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Uma coluna gerada pode ser VIRTUAL
ou STORED
.
Se uma coluna gerada for VIRTUAL
, o SQLite não armazena os valores da coluna fisicamente. Em vez disso, quando você lê os valores da coluna gerada, o SQLite calcula esses valores com base na expressão especificada na declaração da coluna.
Caso uma coluna gerada seja STORED
, o SQLite armazena os valores da coluna fisicamente. Em outras palavras, a STORED
coluna gerada ocupa espaços no arquivo do banco de dados. SQLite atualiza os valores da STORED
coluna gerada quando você grava no banco de dados.
SQLite usa VIRTUAL
por padrão quando você não especifica explicitamente VIRTUAL
ou STORED
na declaração de coluna gerada.
Na prática, você utiliza a STORED
opção quando deseja otimizar para leitura e a opção VIRTUAL quando deseja otimizar para escrita.
Exemplo de coluna gerada por SQLite
Primeiro, crie uma tabela chamada products
usando a seguinte CREATE TABLE
instrução:
CREATE TABLE products(
name TEXT NOT NULL,
price REAL NOT NULL,
discount REAL NOT NULL,
tax REAL NOT NULL,
net_price REAL GENERATED ALWAYS
AS (price * (1-discount) * (1+tax))
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Na products
tabela, net_price
é uma coluna gerada cujo valor deriva das colunas de preço, desconto e imposto.
Como não especificamos VIRTUAL
ou STORED
para a net_price
coluna, a net_price
coluna é usada VIRTUAL
por padrão.
Segundo, insira uma nova linha na products
tabela. Observe que ele não fornece valores para a net_price
coluna:
INSERT INTO products(name, price, discount, tax)
VALUES('ABC Widget',100, 0.05, 0.07);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Terceiro, consulte os dados da products
tabela:
SELECT * FROM products;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Resultado:
name price discount tax net_price
---------- ---------- ---------- ---------- ----------
ABC Widget 100.0 0.05 0.07 101.65
Linguagem de código: Sessão Shell ( shell )
Como você pode ver claramente na saída, o valor da net_price
coluna é calculado com base nos valores das colunas price
, discount
e tax
.
Recursos de coluna gerada pelo SQLite
As colunas geradas possuem os seguintes recursos:
- Uma coluna gerada pode ter um tipo de dados. O SQLite converterá o valor para
expression
esse tipo de dados usando as mesmas regras de afinidade das colunas regulares. - Uma coluna gerada pode ter restrições
NOT NULL
,CHECK
,UNIQUE
eFOREIGN KEY
. - Uma coluna gerada pode fazer parte de um ou mais índices.
- Uma coluna gerada pode fazer referência a outras colunas, incluindo outras colunas geradas na mesma tabela, desde que não faça referência a si mesma.
SQLite coloca as seguintes restrições nas colunas geradas:
- Uma coluna gerada não pode ter um valor padrão.
- Uma coluna gerada não pode ser usada como parte de um arquivo
PRIMARY KEY
. - Se uma tabela tiver uma coluna gerada, ela deverá ter pelo menos uma coluna gerada.
- NÃO é possível usar a
ALTER TABLE ADD COLUMN
instrução para adicionar umaSTORED
coluna. Porém, é possível usar aALTER TABLE ADD COLUMN
instrução para adicionar umaVIRTUAL
coluna. - Uma coluna gerada não pode fazer referência a si mesma, direta ou indiretamente.
- A expressão não pode usar subconsultas , funções agregadas , funções de janela ou funções com valor de tabela. Ele só pode fazer referência a constantes literais, colunas nas mesmas linhas e funções determinísticas escalares.
- A expressão de uma coluna gerada pode fazer referência a uma
INTEGER PRIMARY KEY
coluna, mas não pode fazer referência direta a umaROWID
coluna.
Resumo
- Colunas geradas são colunas cujos valores derivam de outras colunas da mesma tabela.
- Use
GENERATED ALWAYS
restrição para declarar uma coluna gerada. - Use a opção
VIRTUAL
ouSTORED
para uma coluna gerada. ASTORED
coluna ocupa espaço no arquivo de banco de dados, enquanto aVIRTUAL
coluna não. Por padrão, o SQLite usa aVIRTUAL
opção se você não a especificar.