Quando percebemos, após a tabela ser criada, que foi cometido um erro ou que os requisitos da aplicação 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.
É possível:
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 contém valores nulos nas linhas existentes na tabela.
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 <> '');
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 preencher a nova coluna das linhas existentes com o valor padrão, o que ainda não está implementado. Porém, o valor padrão para a coluna pode ser especificado posteriormente.
Para remover uma coluna, utiliza-se:
ALTER TABLE produtos DROP COLUMN descricao;
É 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 é fácil, caso contrário o sistema atribui à 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 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).
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;
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, ao menos no PostgreSQL. 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 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;