SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

Como criar uma coluna computada no SQLite


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.