Eu tenho uma tabela PostgreSQL 13 bastante grande que preciso adicionar uma nova TEXT
coluna e com esta nova coluna gostaria de adicionar uma GENERATED ALWAYS
coluna com a seguinte definição:
ALTER TABLE my_table
ADD COLUMN text_col TEXT,
ADD COLUMN text_col__tsvector GENERATED ALWAYS AS (to_tsvector('pt_unaccent', "text_col")) STORED;
No entanto, quando executo o DDL acima, demora muito para ser concluído. Pelo que entendi, é porque é text_col__tsvector
necessário executar a expressão para todas as linhas da tabela, mesmo que text_col
seja NULL
.
Minha dúvida é: sabendo que a text_col
coluna sempre começará como NULL
(nenhum valor padrão está definido) existe uma maneira de fazer o postgres pular a parte da primeira geração na criação do text_col__tsvector
? Ou alterar a parte da expressão ( to_tsvector('pt_unaccent', "text_col")
) da GENERATED ALWAYS
coluna para ignorar NULL
valores?
Atualmente (postgresql 16) apenas colunas geradas armazenadas são implementadas e adicionar tal coluna sempre executa a reescrita completa da tabela com o valor calculado e preenchido. Não há como evitar essa reescrita da tabela.
Você pode preencher o valor de um campo à moda antiga, usando um gatilho em vez de uma coluna gerada. Também é possível que você não precise de uma nova coluna, mas de um índice em expression . Um índice na expressão pode ser construído simultaneamente.