PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

A adição de uma coluna não anulável à tabela existente falha. O atributo value está sendo ignorado?

Resposta curta


O atributo "value" não funcionará se você estiver adicionando uma restrição não nula no momento da criação da coluna (isso não é mencionado no documentação ). O SQL gerado não poderá ser executado.

Solução


A solução alternativa descrita na pergunta é o caminho a seguir. O SQL resultante será:

  1. Adicione a coluna
    ALTER TABLE layer ADD COLUMN abstract_trimmed varchar(455);
    

  2. Defina-o como um valor não nulo para cada linha
    UPDATE table SET abstract_trimmed = 'No text';
    

  3. Adicione a restrição NOT NULL
    ALTER TABLE layer ALTER COLUMN abstract_trimmed SET NOT NULL;
    

Por quê?


Um padrão de coluna só é inserido na coluna com um INSERT . A tag "value" fará isso para você, mas depois a coluna é adicionada. Liquibase tenta adicionar a coluna em uma etapa, com o NOT NULL restrição em vigor:
ALTER TABLE layer ADD abstract_trimmed VARCHAR(455) NOT NULL;

... o que não é possível quando a tabela já contém linhas. Simplesmente não é inteligente o suficiente.

Solução alternativa


Desde o PostgreSQL 8.0 (tão quase para sempre até agora) uma alternativa seria adicionar a nova coluna com um DEFAULT não nulo :
ALTER TABLE layer
ADD COLUMN abstract_trimmed varchar(455) NOT NULL DEFAULT 'No text';

O manual: