Alterando Tabelas
Quando alterar uma tabela?
Voce criou a tabela, ja tem dados nela, e agora percebe que precisa de uma coluna nova? Ou quer mudar o tipo de uma coluna? Nao precisa apagar e recriar a tabela: use ALTER TABLE para modificar a estrutura sem perder os dados existentes.
ADD COLUMN: Adicionar coluna
-- Adicionar uma coluna de email
ALTER TABLE alunos ADD COLUMN email VARCHAR(150);
A nova coluna e criada com NULL em todas as linhas existentes. Se voce quer que ela seja obrigatoria, pode definir um valor padrao:
-- Adicionar coluna com valor padrao
ALTER TABLE alunos ADD COLUMN ativo BOOLEAN DEFAULT true;
Voce tambem pode adicionar com NOT NULL, mas so se definir um DEFAULT (senao as linhas existentes nao teriam valor):
ALTER TABLE alunos ADD COLUMN status VARCHAR(20) NOT NULL DEFAULT 'ativo';
DROP COLUMN: Remover coluna
-- Remover a coluna telefone
ALTER TABLE alunos DROP COLUMN telefone;
RENAME COLUMN: Renomear coluna
-- Renomear de 'fone' para 'telefone'
ALTER TABLE alunos RENAME COLUMN fone TO telefone;
Renomear nao afeta os dados, apenas o nome da coluna. Mas cuidado: se alguma consulta ou aplicacao usa o nome antigo, vai quebrar.
ALTER COLUMN: Modificar tipo ou constraints
Mudar o tipo de dado
-- Mudar o tipo de VARCHAR(50) para VARCHAR(200)
ALTER TABLE alunos ALTER COLUMN nome TYPE VARCHAR(200);
Adicionar ou remover NOT NULL
-- Tornar a coluna obrigatoria
ALTER TABLE alunos ALTER COLUMN email SET NOT NULL;
-- Permitir NULL novamente
ALTER TABLE alunos ALTER COLUMN email DROP NOT NULL;
Alterar valor padrao
-- Definir um valor padrao
ALTER TABLE alunos ALTER COLUMN cidade SET DEFAULT 'Nao informada';
-- Remover o valor padrao
ALTER TABLE alunos ALTER COLUMN cidade DROP DEFAULT;
RENAME TABLE: Renomear tabela
ALTER TABLE alunos RENAME TO estudantes;
Varias alteracoes de uma vez
Voce pode combinar varias alteracoes em um unico comando:
ALTER TABLE alunos
ADD COLUMN email VARCHAR(150),
ADD COLUMN telefone VARCHAR(20),
DROP COLUMN endereco;
Exemplo pratico completo
Imagine que a tabela alunos foi criada assim:
CREATE TABLE alunos (
id SERIAL PRIMARY KEY,
nome VARCHAR(50),
cidade VARCHAR(50)
);
E agora voce precisa:
- Aumentar o tamanho do nome
- Adicionar email (obrigatorio)
- Adicionar data de nascimento
- Renomear cidade para cidade_natal
ALTER TABLE alunos
ALTER COLUMN nome TYPE VARCHAR(150),
ADD COLUMN email VARCHAR(150) NOT NULL DEFAULT '',
ADD COLUMN data_nascimento DATE,
RENAME COLUMN cidade TO cidade_natal;
E nos ORMs? Migrations!
Em projetos reais com ORMs, voce nao roda ALTER TABLE manualmente. Voce cria migrations: arquivos que descrevem a mudanca. O ORM gera o SQL automaticamente.
# Prisma: edite o schema.prisma e rode
npx prisma migrate dev --name adicionar_email
# Drizzle: gere a migration a partir do schema
npx drizzle-kit generate
# Lucid (AdonisJS): crie uma migration
node ace make:migration adicionar_email_alunos
A vantagem das migrations e que elas ficam no historico do projeto. Qualquer pessoa que baixar o codigo pode rodar as migrations e ter o banco identico.
Exercicios
- Adicione uma coluna
cpf(VARCHAR 14, UNIQUE) na tabela alunos. - Renomeie a coluna
nomeparanome_completo. - Mude o tipo da coluna
cidadede VARCHAR(50) para VARCHAR(100). - Remova a coluna
cpfque voce acabou de criar. - Faca todas as alteracoes acima em um unico comando ALTER TABLE.
Referencias
- ALTER TABLE - PostgreSQL Docs -- documentacao oficial
- SQL ALTER TABLE Statement -- W3Schools
- Prisma Migrate -- documentacao de migrations do Prisma
Testa o que você leu
5 perguntas sobre esta aula. Errar aqui não custa nada - a explicação vem junto da correção.