Imagina que você tá desenhando um banco de dados pra uma universidade. No começo, a tabela de estudantes só tem dois campos: ID e nome. Bem simples, a galera começa a usar o sistema. Mas aí, depois de um mês, os professores chegam e falam: "E aí, rola de adicionar idade também?", e logo depois: "Precisa de um email aí". E então: "Bora tirar o campo middle_name, ninguém preenche isso mesmo!". É aí que suas skills com ALTER TABLE pra adicionar e remover colunas vão salvar o dia.
Sintaxe pra adicionar colunas
Então, pra adicionar uma nova coluna numa tabela já existente no PostgreSQL, você usa o comando ALTER TABLE. Olha só a sintaxe:
ALTER TABLE table_name
ADD COLUMN column_name data_type [constraints];
table_name— nome da tabela onde você quer adicionar a nova coluna.column_name— nome da coluna que você quer adicionar.data_type— tipo de dado, tipoVARCHAR,INTEGERouDATE.constraints(opcional) — restrições que você quer colocar nessa coluna, tipoNOT NULL,DEFAULTe por aí vai.
Exemplo: adicionando uma nova coluna
Vamos supor que a gente tem uma tabela students que foi criada assim:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
De repente, pedem pra adicionar uma coluna age pra guardar a idade dos estudantes. Olha como faz:
ALTER TABLE students
ADD COLUMN age INTEGER;
Agora a estrutura da tabela students vai ficar assim:
| id | name | age |
|---|---|---|
| 1 | Eva | NULL |
| 2 | Alex | NULL |
Se você adicionar novos registros sem informar a idade, o PostgreSQL vai colocar NULL automaticamente, já que a gente não colocou nenhuma restrição tipo NOT NULL ou valor padrão (DEFAULT).
Sintaxe pra remover colunas
Remover uma coluna de uma tabela também é com o comando ALTER TABLE. A sintaxe é essa aqui:
ALTER TABLE table_name
DROP COLUMN column_name [RESTRICT | CASCADE];
table_name— nome da tabela de onde você quer remover a coluna.column_name— nome da coluna que vai ser removida.RESTRICT— impede remover a coluna se ela tiver referência em outro lugar (padrão).CASCADE— remove a coluna junto com tudo que depende dela.
Sobre remoção em cascata eu explico melhor no próximo nível :P
Exemplo: removendo uma coluna desnecessária
Voltando pra tabela students. Decidimos que o campo age não precisa mais. Bora remover:
ALTER TABLE students
DROP COLUMN age;
Agora a estrutura da tabela ficou mais simples de novo:
| id | name |
|---|---|
| 1 | Eva |
| 2 | Alex |
Exemplos úteis
Adicionando coluna com restrições
E se você quisesse adicionar a coluna age, mas com NOT NULL e um valor padrão? O código seria assim:
ALTER TABLE students
ADD COLUMN age INTEGER NOT NULL DEFAULT 18;
Agora, em todas as linhas que já existem, o campo age vai ficar com valor 18, e os novos registros vão exigir que você informe a idade, a não ser que use o valor padrão.
Removendo coluna com dependências
Se uma coluna tem dependências (tipo, ela é usada em views ou triggers), você vai ter que usar o modificador CASCADE. Mas cuidado: isso pode afetar outros objetos no seu banco. Por exemplo:
ALTER TABLE students
DROP COLUMN email CASCADE;
Erros comuns e particularidades
Erro: adicionando coluna com tipo de dado errado.
Imagina que você adiciona uma coluna do tipo INTEGER, mas tenta guardar texto nela. O PostgreSQL não vai curtir e vai dar erro quando você tentar inserir os dados. O tipo de dado sempre tem que bater com o que você vai guardar.
Erro: removendo coluna sem olhar as dependências.
Por exemplo, se você remover uma coluna que tem índice ou foreign key, o PostgreSQL pode dar erro se você não usar o modificador CASCADE.
Erro: removendo coluna com dependências. Por exemplo, se você remover uma coluna que tem índice ou foreign key, o PostgreSQL pode dar erro se você não usar o modificador CASCADE. Aí você colocou o CASCADE e removeu milhares de linhas que dependiam da coluna que sumiu. Que não era pra ter removido : (
Particularidade: ordem das operações.
Às vezes, adicionar colunas com restrições exige que você saiba a ordem das operações. Tipo, se você vai adicionar uma coluna com NOT NULL, primeiro tem que preencher ela com um valor padrão, senão o PostgreSQL vai reclamar.
GO TO FULL VERSION