5.6. Modificação de tabelas

PostgreSQL 14.5: Modificação de tabelas

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:

Todas estas atividades são realizadas utilizando o comando ALTER TABLE.

5.6.1. Adicionar coluna

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.

5.6.2. Remover coluna

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.

5.6.3. Adicionar restriçã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.

5.6.4. Remover restrição

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)

5.6.5. Mudar valor padrão da coluna

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.

5.6.6. Mudar o tipo de dado da coluna

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.

5.6.7. Mudar nome de coluna

Para mudar o nome de uma coluna, utiliza-se:

ALTER TABLE produtos RENAME COLUMN cod_prod TO cod_produto;

5.6.8. Mudar nome de tabela

Para mudar o nome de uma tabela, utiliza-se:

ALTER TABLE produtos RENAME TO equipamentos;
SourceForge.net Logo CSS válido!