Imagina que você tá criando uma tabela de estudantes pra uma universidade. De novo! :)
No começo, você decide que o campo pra idade age vai ser inteiro e coloca o tipo SMALLINT (serve pra números de -32.768 até 32.767). Mas aí, com o tempo, o banco cresce e você começa a adicionar estudantes de outros países, que informam a idade... em dias desde o nascimento! Aí o seu SMALLINT já não dá conta — hora de trocar, tipo pra INTEGER.
Olha aí mais uns casos comuns onde você vai precisar mudar o tipo de dado:
- Aumentar ou diminuir o intervalo de números.
- Mudar o tamanho das strings (tipo de
VARCHAR(50)praVARCHAR(100)). - Trocar pra outro tipo de dado pra otimizar (tipo transformar
TEXTemVARCHAR). - Erro na escolha do tipo da coluna (tipo você colocou
BOOLEANem vez deINTEGER).
Sintaxe do comando pra mudar tipo de dado
No PostgreSQL, mudar o tipo de dado de uma coluna é feito com o comando ALTER TABLE. Ele deixa você adaptar a estrutura da tabela pra novas necessidades.
ALTER TABLE table_name
ALTER COLUMN column_name TYPE new_data_type;
Bem simples: você coloca o nome da tabela, a coluna que quer mudar e o novo tipo de dado pra ela.
Exemplo 1: Mudando de INTEGER pra BIGINT
Vamos supor que temos uma tabela de estudantes:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INTEGER
);
Tava tudo certo, até que a idade passou de milhões de anos (não pergunta, é só exemplo!). Pra deixar o PostgreSQL de boa, bora trocar o tipo da coluna age de INTEGER pra BIGINT:
ALTER TABLE students
ALTER COLUMN age TYPE BIGINT;
Exemplo 2: Aumentando o tamanho da string
Você criou uma tabela pra guardar cursos e colocou que os nomes vão ter até 50 caracteres:
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name VARCHAR(50)
);
Mas aí descobre que os nomes dos cursos são bem mais complicados e longos do que você pensou. Fácil de resolver:
ALTER TABLE courses
ALTER COLUMN name TYPE VARCHAR(150);
Exemplo 3: Convertendo tipos
Digamos que a gente tinha uma tabela onde o campo birth_date era texto:
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
birth_date TEXT
);
Você percebe que trabalhar com datas como TEXT não é eficiente, porque não dá pra filtrar ou ordenar. Solução? Vamos converter TEXT pra DATE:
ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE USING birth_date::DATE;
Repara na parte USING birth_date::DATE. Ela diz pro PostgreSQL que precisa converter os dados antes de trocar o tipo.
Por que às vezes precisa conversão explícita dos dados?
Quando o PostgreSQL tenta mudar o tipo, ele tenta converter os dados automaticamente pro novo tipo. Se não rolar, dá erro. Por exemplo, mudar um campo TEXT pra INTEGER sem dizer como transformar o texto vai dar ruim.
Exemplo de problema
ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE;
-- Erro: não dá pra converter o valor 'not a date' pro tipo DATE.
Tem solução pra esse problema. Adiciona uma conversão explícita usando USING:
ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE USING to_date(birth_date, 'YYYY-MM-DD');
Aqui a gente usa a função to_date() pra transformar as strings em datas.
Comando USING
No PostgreSQL, quando você muda o tipo de uma coluna com ALTER TABLE ... ALTER COLUMN ... TYPE, às vezes precisa dizer como converter os dados existentes — e aí entra a palavra-chave USING.
Sintaxe:
ALTER TABLE table_name
ALTER COLUMN column_name TYPE new_data_type
USING expression;
Explicando:
USINGdeixa você dizer a fórmula de conversão dos valores do tipo antigo pro novo.- Isso é útil principalmente quando a conversão automática não rola ou é confusa.
Exemplo simples: string → número
ALTER TABLE users
ALTER COLUMN age TYPE INTEGER
USING age::INTEGER;
Aqui o age era TEXT e a gente quer transformar em INTEGER. USING age::INTEGER faz a conversão explícita.
Exemplo: texto → data
ALTER TABLE events
ALTER COLUMN event_date TYPE DATE
USING TO_DATE(event_date, 'YYYY-MM-DD');
Se event_date era texto tipo '2023-10-25', a gente diz pro PostgreSQL como transformar em DATE.
Quando USING é obrigatório?
- Quando não tem conversão direta de tipos.
- Quando os dados precisam ser transformados.
- Quando os tipos não são compatíveis (
TEXT→BOOLEAN,VARCHAR→INTEGERetc).
Erros comuns ao mudar tipos de dados
Erro por falta de conversão dos dados. Se não dá pra converter automaticamente, sempre coloca a conversão com USING.
ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE;
-- Erro: coluna 'birth_date' tem valores inválidos pro tipo DATE
A operação bloqueia a tabela. Fica ligado que mudar tipo de dado pode travar a tabela pra escrita até terminar. Isso é importante pra tabelas grandes. Planeja essas mudanças pra horários de pouco movimento.
Problemas com tabelas relacionadas e chaves estrangeiras. Se a coluna faz parte de uma chave estrangeira, mudar o tipo pode ser mais complicado. O PostgreSQL vai pedir pra recriar as chaves estrangeiras.
Dicas úteis
Sempre confira os dados atuais. Usa consultas tipo SELECT DISTINCT column_name antes de mudar o tipo, pra ver se dá pra converter sem erro.
Testa as mudanças. Cria uma cópia temporária da tabela e faz testes nela antes de mexer na tabela principal. Tipo assim:
CREATE TEMP TABLE temp_students AS SELECT * FROM students;
Não esquece do USING. Ele salva sua vida quando o tipo muda radicalmente (tipo TEXT → NUMERIC).
Agora você já sabe como mudar o tipo de dado de uma coluna no PostgreSQL. Espero que da próxima vez que precisar repensar a estrutura dos dados, você fique tranquilo. Tabelas são espertas, mas até elas precisam de um upgrade de vez em quando!
GO TO FULL VERSION