O PostgreSQL suporta colunas geradas ? Também conhecido como colunas virtuais . Não estou falando de IDENTITY
colunas .
Não consigo encontrar nenhuma informação sobre esse recurso notável, mas sei que ele está disponível no SQL Server e nas versões mais recentes do MariaDB e MySQL.
O recurso é mencionado no padrão SQL:2003 , e houve alguma discussão nos fóruns do PostgreSQL por volta de 2006, mas não consigo encontrar nada substancial sobre o assunto.
Há alguma discussão sobre o SO, mas é bastante antigo agora, então pode estar desatualizado.
Não tenho certeza se é isso que você quer, mas a notação de atributo e a notação
row.full_name
de funçãofull_name(row)
são equivalentes no postgresql.Isso significa que você pega uma mesa
e uma função:
e chame assim:
É aquilo que você precisa?
Para acelerar as coisas, você pode criar um índice de expressão:
Ou armazene tudo em uma visão materializada.
Exemplo retirado daqui: http://bernardoamc.github.io/sql/2015/05/11/postgres-virtual-columns/
Sim:
GENERATED ALWAYS AS … STORED
O Postgres 12 adiciona a funcionalidade para colunas geradas, conforme mencionado no padrão SQL:2003 .
O valor é gerado no momento de um
INSERT
ouUPDATE
, depois armazenado com a linha como qualquer outro valor.Um gerado deve ser baseado em uma coluna base da mesma tabela ou em uma função imutável .
A sintaxe é simples, uma cláusula sobre
CREATE TABLE
:Exemplo:
Características:
Ressalvas:
Ver:
Não, atualmente (a partir do Postgres 9.6) não há suporte.
A única solução é usar um gatilho ou uma exibição se for um cálculo simples que você não precisa indexar.
Dependendo do seu caso de uso, você pode obter esse tipo de comportamento declarando uma nova coluna e preenchendo-a com um gatilho na inserção/atualização.
Eu usaria as respostas acima, se possível, para evitar a duplicação de dados que podem ser derivados do que você já tem, mas isso funciona e pode ser útil para campos derivados computacionalmente intensivos que você deseja calcular uma vez e salvar.
Considerei essa abordagem para lidar com um problema em que às vezes eu tinha apenas 15 dígitos de uma chave de 18 dígitos (os últimos 3 dígitos são apenas uma soma de verificação), mas queria poder impor um relacionamento de chave estrangeira.
Documentos PG sobre gatilhos: https://www.postgresql.org/docs/9.6/sql-createtrigger.html
Exemplo W3: https://www.w3resource.com/PostgreSQL/postgresql-triggers.php