ALTER TABLE [ ONLY ] nome [ * ] ADD [ COLUMN ] coluna tipo [ restrição_de_coluna [ ... ] ] ALTER TABLE [ ONLY ] nome [ * ] DROP [ COLUMN ] coluna [ RESTRICT | CASCADE ] ALTER TABLE [ ONLY ] nome [ * ] ALTER [ COLUMN ] coluna { SET DEFAULT expressão | DROP DEFAULT } ALTER TABLE [ ONLY ] nome [ * ] ALTER [ COLUMN ] coluna { SET | DROP } NOT NULL ALTER TABLE [ ONLY ] nome [ * ] ALTER [ COLUMN ] coluna SET STATISTICS inteiro ALTER TABLE [ ONLY ] nome [ * ] ALTER [ COLUMN ] coluna SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } ALTER TABLE [ ONLY ] nome [ * ] SET WITHOUT OIDS ALTER TABLE [ ONLY ] nome [ * ] RENAME [ COLUMN ] coluna TO novo_nome_da_coluna ALTER TABLE nome RENAME TO novo_nome_da_tabela ALTER TABLE [ ONLY ] nome [ * ] ADD restrição_de_tabela ALTER TABLE [ ONLY ] nome [ * ] DROP CONSTRAINT nome_da_restrição [ RESTRICT | CASCADE ] ALTER TABLE nome OWNER TO novo_dono ALTER TABLE nome CLUSTER ON nome_do_índice
O comando ALTER TABLE altera a definição de uma tabela existente. Existem várias sub-formas:
É necessário ser o dono da tabela para utilizar o comando ALTER TABLE; exceto ALTER TABLE OWNER, que só pode ser executado por um superusuário.
A palavra chave COLUMN é apenas informativa, podendo ser omitida.
Na atual implementação de ADD COLUMN, as cláusulas valor padrão e NOT NULL não são permitidas para a nova coluna. A nova coluna é sempre criada com todos os valores nulos. Pode ser usada a forma SET DEFAULT do comando ALTER TABLE para definir o valor padrão mais tarde (Os valores atuais das linhas existentes poderão ser atualizados, posteriormente, para o novo valor padrão usando o comando UPDATE ). Se for desejado marcar a coluna como não aceitando valores nulos, deve ser utilizada a forma SET NOT NULL após ter entrado com valores não nulos para a coluna em todas as linhas.
A forma DROP COLUMN não remove fisicamente a coluna, simplesmente torna a coluna invisível para as operações SQL. As operações subseqüentes de inclusão e de atualização na tabela armazenam o valor nulo na coluna. Portanto, remover uma coluna é rápido mas não reduz imediatamente o espaço em disco da tabela, porque o espaço ocupado pela coluna removida não é recuperado. O espaço é recuperado ao longo do tempo à medida que as linhas existentes são atualizadas. Para recuperar todo o espaço de uma vez deve ser feita uma atualização fictícia de todas as linhas e, depois, executado o comando VACUUM, como em:
UPDATE tabela SET coluna = coluna; VACUUM FULL tabela;
Se a tabela possuir tabelas descendentes, não é permitido adicionar ou mudar o nome da coluna na tabela ancestral sem fazer o mesmo nas tabelas descendentes, ou seja, o ALTER TABLE ONLY é rejeitado. Isto garante que as tabelas descendentes sempre possuem colunas correspondendo às da tabela ancestral.
A operação DROP COLUMN recursiva remove a coluna de uma tabela descendente somente se a tabela descendente não herdar esta coluna de outros ancestrais, e se nunca teve definição independente para a coluna. A operação DROP COLUMN não recursiva (ou seja, ALTER TABLE ONLY ... DROP COLUMN) nunca remove qualquer coluna descendente e, em vez disto, marca estas colunas como definidas independentemente em vez de herdadas.
Mudar qualquer parte de uma tabela do catálogo do sistema não é permitido.
Consulte o comando CREATE TABLE para obter uma descrição mais completa dos parâmetros válidos. O Capítulo 5 contém mais informações sobre herança.
Para adicionar uma coluna do tipo varchar a uma tabela:
ALTER TABLE distribuidores ADD COLUMN endereco varchar(30);
Para excluir uma coluna da tabela:
ALTER TABLE distribuidores DROP COLUMN endereco RESTRICT;
Para mudar o nome de uma coluna existente:
ALTER TABLE distribuidores RENAME COLUMN endereco TO cidade;
Para mudar o nome de uma tabela existente:
ALTER TABLE distribuidores RENAME TO fornecedores;
Para adicionar uma restrição de não nulo a uma coluna:
ALTER TABLE distribuidores ALTER COLUMN logradouro SET NOT NULL;
Para remover a restrição de não nulo da coluna:
ALTER TABLE distribuidores ALTER COLUMN logradouro DROP NOT NULL;
Para adicionar uma restrição de verificação a uma tabela:
ALTER TABLE distribuidores ADD CONSTRAINT chk_cep CHECK (char_length(cod_cep) = 8);
Para remover uma restrição de verificação de uma tabela e de todas as suas descendentes:
ALTER TABLE distribuidores DROP CONSTRAINT chk_cep;
Para adicionar uma restrição de chave estrangeira a uma tabela:
ALTER TABLE distribuidores ADD CONSTRAINT fk_dist FOREIGN KEY (endereco) REFERENCES enderecos (endereco) MATCH FULL;
Para adicionar uma restrição de unicidade (multicoluna) à tabela:
ALTER TABLE distribuidores ADD CONSTRAINT unq_id_dist_cod_cep UNIQUE (id_dist, cod_cep);
Para adicionar uma restrição de chave primária a uma tabela com o nome gerado automaticamente, levando em conta que a tabela pode possuir somente uma única chave primária:
ALTER TABLE distribuidores ADD PRIMARY KEY (id_dist);
A forma ADD COLUMN está em conformidade com o padrão SQL, a não ser por não suportar as opções de valor padrão e de não nulo, conforme explicado anteriormente. A forma ALTER COLUMN está em conformidade total.
As cláusulas para mudar os nomes das tabelas, colunas, índices, visões e seqüências são extensões do PostgreSQL ao padrão SQL.
O comando ALTER TABLE DROP COLUMN pode ser utilizado para remover a única coluna da tabela, produzindo uma tabela com zero coluna. Esta é uma extensão ao SQL, que não permite tabelas sem nenhuma coluna.