Temos um aplicativo Rails desenvolvido com Postgresql v11.4 onde quero adicionar uma nova coluna com um valor padrão e uma restrição not null como abaixo:
ALTER TABLE "blogs" ADD "published" boolean DEFAULT FALSE NOT NULL
Eu sei que adicionar uma nova coluna com um valor padrão é seguro. No entanto, ainda é seguro quando combinado com NOT NULL
? Ou bloqueará o banco de dados? Obrigado!
Essa afirmação é segura.
Um ALTER TABLE nunca bloqueará "o banco de dados", apenas bloqueará a tabela.
O Postgres não irá reescrever a tabela porque você forneceu um valor constante (
false
) para o valor padrão. Portanto, adicionar a coluna é feito em alguns milissegundos porque o Postgres armazena apenas as informações de que uma nova coluna está disponível. Quando essa coluna for acessada (e nenhum valor estiver disponível), ela usará o valor padrão da definição da coluna . Somente quando uma linha for atualizada, a nova linha conterá um valor real para a coluna.Se o valor padrão fosse uma expressão que poderia ser diferente para cada linha, o Postgres reescreveria a tabela para colocar fisicamente a coluna padrão em todas as linhas. Mas ainda assim, isso bloquearia apenas a tabela, não o banco de dados.
Da documentação do Postgres sobre
ALTER TABLE
: "Quando uma coluna é adicionada comADD COLUMN
e um não volátilDEFAULT
é especificado, o padrão é avaliado no momento da instrução e o resultado armazenado nos metadados da tabela. Esse valor será usado para a coluna para todos os existentes linhas. Se nãoDEFAULT
for especificado, NULL será usado. Em nenhum dos casos é necessária uma reescrita da tabela."E testado no Postgres v.11: dbfiddle.uk