Quando percebemos, após a tabela ser criada, que foi cometido um erro ou que os requisitos do aplicativo mudaram, é possível remover a tabela e criá-la novamente. Porém, esta opção não é conveniente quando existem dados na tabela, ou se a tabela é referenciada por outros objetos do banco de dados (por exemplo, uma restrição de chave estrangeira); por isso, o PostgreSQL disponibiliza um conjunto de comandos para realizar modificações em tabelas existentes. Deve ser observado que esta operação é conceitualmente distinta da alteração dos dados contidos na tabela, aqui o interesse está em mudar a definição, ou estrutura, da tabela.
É possível:
Adicionar coluna;
Remover coluna;
Adicionar restrição;
Remover restrição;
Mudar valor padrão;
Mudar tipo de dado de coluna;
Mudar nome de coluna;
Mudar nome de tabela.
Todas estas atividades são realizadas utilizando o comando ALTER TABLE.
Para adicionar uma coluna, utiliza-se:
ALTER TABLE produtos ADD COLUMN descricao text;
Inicialmente a nova coluna é preenchida com o valor padrão especificado, ou nulo se a cláusula DEFAULT não for especificada.
Também podem ser definidas, ao mesmo tempo, restrições para a coluna utilizando a sintaxe habitual:
ALTER TABLE produtos ADD COLUMN descricao text CHECK (descricao <> '');
Na verdade, todas as opções que podem ser aplicadas à descrição da coluna no comando CREATE TABLE podem ser utilizadas aqui. Entretanto, tenha em mente que o valor padrão deve satisfazer as restrições especificadas, ou o ADD não será bem-sucedido. Como alternativa, as restrições podem ser adicionadas posteriormente (veja abaixo), após a nova coluna ter sido preenchida com dados adequados.
Para remover uma coluna, utiliza-se:
ALTER TABLE produtos DROP COLUMN descricao;
Os dados presentes na coluna desaparecem. As restrições de tabela que envolvem a coluna também são removidas. Entretanto, se a coluna for referenciada por uma restrição de chave estrangeira de outra tabela, o PostgreSQL não irá remover esta restrição em silêncio. Pode ser autorizada a remoção de tudo que depende da coluna adicionando CASCADE:
ALTER TABLE produtos DROP COLUMN descricao CASCADE;
Consulte a Seção 5.10 para obter uma descrição geral do mecanismo por trás desta operação.
É utilizada a sintaxe de restrição de tabela para adicionar uma restrição. Por exemplo:
ALTER TABLE produtos ADD CHECK (nome <> ''); ALTER TABLE produtos ADD CONSTRAINT unq_cod_prod UNIQUE (cod_prod); ALTER TABLE produtos ADD FOREIGN KEY (fk_grupo_produtos) REFERENCES grupo_produtos;
Para adicionar a restrição de não nulo, que não pode ser escrita na forma de restrição de tabela, deve ser utilizada a sintaxe:
ALTER TABLE produtos ALTER COLUMN cod_prod SET NOT NULL;
A restrição será verificada imediatamente, portanto os dados da tabela devem satisfazer a restrição para esta poder ser adicionada.
Para remover uma restrição é necessário conhecer seu nome. Se foi atribuído um nome à restrição fica fácil, caso contrário será necessário descobrir o nome gerado que sistema atribuiu à restrição. O comando \d nome_da_tabela do psql pode ser útil nesta situação; outras interfaces também podem oferecer uma forma de inspecionar os detalhes das tabelas. O comando utilizado para remover restrição é:
ALTER TABLE produtos DROP CONSTRAINT nome_da_restrição;
(Caso esteja lidando com um nome de restrição gerado, como $2, não se esqueça de colocar entre aspas para torná-lo um identificador válido).
Da mesma forma que para remover uma coluna, é necessário adicionar CASCADE se for desejado remover uma restrição que outro objeto dependa. Um exemplo é a restrição de chave estrangeira, que depende da restrição de unicidade ou de chave primária nas colunas referenciadas.
Esta sintaxe serve igualmente para todos os tipos de restrição, exceto não-nulo. Para remover uma restrição de não-nulo, utiliza-se:
ALTER TABLE produtos ALTER COLUMN cod_prod DROP NOT NULL;
(Lembre-se que as restrições de não-nulo não possuem nome)
Para definir um novo valor padrão para a coluna, utiliza-se:
ALTER TABLE produtos ALTER COLUMN preco SET DEFAULT 7.77;
Deve ser observado que este comando não afeta nenhuma coluna existente na tabela, apenas muda o valor padrão para os próximos comandos INSERT.
Para remover o valor padrão para a coluna, utiliza-se:
ALTER TABLE produtos ALTER COLUMN preco DROP DEFAULT;
Efetivamente é o mesmo que definir o valor nulo como sendo o valor padrão. Como conseqüência, não é errado remover um valor padrão que não tenha sido definido, porque implicitamente o valor nulo é o valor padrão.
Para converter a coluna em um tipo de dado diferente, utiliza-se:
ALTER TABLE produtos ALTER COLUMN preco TYPE numeric(10,2);
Este comando somente será bem-sucedido se todas as entradas existentes na coluna puderem ser convertidas para o novo tipo através de uma conversão implícita. Se for necessária uma conversão mais complexa, poderá ser adicionada a cláusula USING especificando como calcular os novos valores a partir dos antigos.
O PostgreSQL tenta converter o valor padrão da coluna (se houver) para o novo tipo, assim bem como todas as restrições que envolvem a coluna. Mas estas conversões podem falhar, ou podem produzir resultados surpreendentes. Geralmente é melhor remover todas as restrições da coluna antes de alterar o seu tipo, e depois adicionar novamente estas restrições modificadas de forma apropriada.
Para mudar o nome de uma coluna, utiliza-se:
ALTER TABLE produtos RENAME COLUMN cod_prod TO cod_produto;
Para mudar o nome de uma tabela, utiliza-se:
ALTER TABLE produtos RENAME TO equipamentos;