2.6. Modificação de tabelas

Quando percebemos, após a tabela ter sido criada, que foi cometido um erro ou que as necessidades da aplicação mudaram, é possível remover a tabela e criá-la novamente. Porém, este procedimento 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). Para esta finalidade o PostgreSQL disponibiliza um conjunto de comandos que realizam modificações em tabelas existentes.

Pode ser feito:

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

2.6.1. Incluir coluna

Para incluir uma coluna deve ser utilizado o comando:

ALTER TABLE produtos ADD COLUMN descricao text;

Inicialmente a nova coluna conterá valores nulos nas linhas existentes na tabela.

Também pode ser definida uma restrição para a coluna quando esta é incluída utilizando a sintaxe usual:

ALTER TABLE produtos ADD COLUMN descricao text CHECK (descricao <> '');

A nova coluna não pode possuir a restrição de não-nulo, porque a coluna inicialmente deve conter valores nulos. Porém, a restrição de não-nulo pode ser adicionada posteriormente. Também não pode ser definido um valor padrão para a nova coluna. De acordo com o padrão SQL esta definição deve fazer, nas novas colunas, as linhas existentes serem preenchidas com o valor padrão, mas ainda não está implementado. Porém, o valor padrão para a coluna pode ser especificado posteriormente.

2.6.2. Excluir coluna

Para excluir uma coluna deve ser utilizado o comando:

ALTER TABLE produtos DROP COLUMN descricao;

2.6.3. Incluir restrição

É utilizada a sintaxe de restrição de tabela para incluir uma nova restrição. Por exemplo:

ALTER TABLE produtos ADD CHECK (nome <> '');
ALTER TABLE produtos ADD CONSTRAINT algum_nome UNIQUE (id_produto);
ALTER TABLE produtos ADD FOREIGN KEY (id_grupo_produto) REFERENCES grupo_produtos;

Para adicionar uma 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 id_produto SET NOT NULL;

A restrição será verificada imediatamente, portanto os dados da tabela devem satisfazer a restrição antes desta ser criada.

2.6.4. Excluir restrição

Para excluir uma restrição é necessário conhecer seu nome. Quando o usuário atribuiu um nome à restrição é fácil, caso contrário o sistema atribui para a restrição um nome gerado que precisa ser descoberto. O comando \d nome_da_tabela do psql pode ser útil nesta situação; outras interfaces também podem oferecer um modo de inspecionar os detalhes das tabelas. O comando a ser utilizado para excluir a restrição é:

ALTER TABLE produtos DROP CONSTRAINT nome_restrição;

Esta sintaxe serve para todos os tipos de restrição exceto não-nulo. Para excluir uma restrição de não-nulo deve ser utilizado o comando:

ALTER TABLE produtos ALTER COLUMN id_produto DROP NOT NULL;

(Lembre-se que as restrições de não-nulo não possuem nome)

2.6.5. Mudar valor padrão

Para definir um novo valor padrão para a coluna deve ser utilizado o comando:

ALTER TABLE produtos ALTER COLUMN preco SET DEFAULT 7.77;

Para remover o valor padrão deve ser utilizado o comando:

ALTER TABLE produtos ALTER COLUMN preco DROP DEFAULT;

Este último comando equivale definir o valor nulo como sendo o valor padrão, ao menos no PostgreSQL. Como conseqüência, não ocasiona erro remover um valor padrão que não tenha sido definido, porque implicitamente o valor nulo é o valor padrão.

2.6.6. Mudar nome de coluna

Para mudar o nome de uma coluna deve ser utilizado o comando:

ALTER TABLE produtos RENAME COLUMN id_produto TO cod_produto;

2.6.7. Mudar nome de tabela

Para mudar o nome de uma tabela deve ser utilizado o comando:

ALTER TABLE produtos RENAME TO equipamentos;