ALTER TABLE

Nome

ALTER TABLE -- altera a definição de uma tabela

Sinopse

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

Descrição

O comando ALTER TABLE altera a definição de uma tabela existente. Existem várias sub-formas:

ADD COLUMN
Esta forma adiciona uma nova coluna à tabela utilizando a mesma sintaxe do comando CREATE TABLE .
DROP COLUMN
Esta forma remove uma coluna da tabela. Os índices e as restrições da tabela que envolvem a coluna também são automaticamente removidos. É necessário especificar CASCADE se algum objeto fora da tabela depender da coluna como, por exemplo, referências de chaves estrangeiras ou visões.
SET/DROP DEFAULT
Estas formas definem ou removem o valor padrão para a coluna. O valor padrão somente é aplicado aos comandos INSERT subseqüentes; não modifica as linhas existentes na tabela. Valores padrão também podem ser criados para visões e, neste caso, são inseridos dentro do comando INSERT na visão, antes da regra ON INSERT da visão ser aplicada.
SET/DROP NOT NULL
Estas formas alteram se a coluna está marcada para permitir valores nulos ou para rejeitar valores nulos. A forma SET NOT NULL só pode ser utilizada quando não existem valores nulos na coluna.
SET STATISTICS
Esta forma define a quantidade de informações armazenadas na coleta de estatísticas por coluna para as operações subseqüentes de ANALYZE . A quantidade pode ser definida no intervalo de 0 a 1000; como alternativa, pode ser definida como -1 para utilizar a quantidade de estatísticas padrão do sistema.
SET STORAGE
Esta forma define o modo de armazenamento da coluna. Controla se a coluna é mantida na mesma tabela ou em uma tabela suplementar, e se os dados devem ser comprimidos ou não. Deve ser utilizado PLAIN para valores de comprimento fixo, como integer, e fica na mesma tabela não comprimido. MAIN é utilizado para dados que ficam na mesma tabela e são compressíveis. EXTERNAL é utilizado para dados externos não comprimidos, e EXTENDED é utilizado para dados externos comprimidos. EXTENDED é o padrão para a maioria dos tipos de dado que suportam armazenamento não-PLAIN. A utilização de EXTERNAL torna as operações de substring em colunas text e bytea mais rápidas, às custas de um aumento no espaço para armazenamento.
SET WITHOUT OIDS
Esta forma remove da tabela a coluna de sistema oid. A remoção dos OIDs da tabela não ocorre imediatamente. O espaço ocupado pelo OID é recuperado quando a linha é atualizada. Se a linha não for atualizada, tanto o espaço quanto o valor do OID são mantidos indefinidamente. A semântica é semelhante à do processo DROP COLUMN.
RENAME
A forma RENAME muda o nome de uma tabela (de um índice, de uma seqüência ou de uma visão), ou o nome de uma coluna da tabela. Não produz efeito sobre os dados armazenados.
ADD restrição_de_tabela
Esta forma adiciona uma nova restrição à tabela utilizando a mesma sintaxe do comando CREATE TABLE .
DROP CONSTRAINT
Esta forma remove restrições de tabela. Atualmente, as restrições de tabela não necessitam ter nomes únicos e, portanto, pode haver mais de uma restrição correspondendo ao nome especificado. Todas as restrições correspondentes são removidas.
OWNER
Esta forma torna o usuário especificado o dono da tabela, índice, seqüência ou visão.
CLUSTER
Esta forma marca a tabela para operações futuras de CLUSTER .

É 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.

Parâmetros

nome
O nome (opcionalmente qualificado pelo esquema) da tabela existente a ser alterada. Se ONLY for especificado, somente esta tabela será alterada. Se ONLY não for especificado, a tabela e todas as suas tabelas descendentes (caso existam) são alteradas. O * pode ser adicionado ao nome da tabela para indicar que as tabelas descendentes devem ser alteradas, mas na versão atual este é comportamento padrão (Nas versões anteriores a 7.1 ONLY era o comportamento padrão. O padrão pode ser alterado mudando o parâmetro de configuração sql_inheritance).
coluna
O nome de uma coluna nova ou existente.
tipo
O tipo de dado da nova coluna.
novo_nome_da_coluna
Novo nome para uma coluna existente.
novo_nome_da_tabela
O novo nome da tabela.
restrição_de_tabela
Nova restrição de tabela (table constraint) para a tabela.
nome_da_restrição
O nome da restrição existente a ser removida.
novo_dono
O nome de usuário do novo dono da tabela.
nome_do_índice
O nome do índice pelo qual a tabela deve ser marcada para agrupamento (clustering).
CASCADE
Remove, automaticamente, os objetos que dependem da coluna ou da restrição removida (por exemplo, visões fazendo referência à coluna).
RESTRICT
Não permite remover a coluna ou a restrição caso existam objetos que dependam das mesmas. Este é o comportamento padrão.

Observações

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.

Exemplos

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);

Compatibilidade

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.

SourceForge.net Logo