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:
Incluir coluna;
Excluir coluna;
Incluir restrição;
Excluir restrição;
Mudar valor padrão;
Mudar nome de coluna;
Mudar nome de tabela.
Todas estas atividades são realizadas utilizando o comando ALTER TABLE.
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.
Para excluir uma coluna deve ser utilizado o comando:
ALTER TABLE produtos DROP COLUMN descricao;
É 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.
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)
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.
Para mudar o nome de uma coluna deve ser utilizado o comando:
ALTER TABLE produtos RENAME COLUMN id_produto TO cod_produto;
Para mudar o nome de uma tabela deve ser utilizado o comando:
ALTER TABLE produtos RENAME TO equipamentos;