CodeGym /Cursos /SQL SELF /Mudando tipos de dados das colunas

Mudando tipos de dados das colunas

SQL SELF
Nível 18 , Lição 1
Disponível

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:

  1. Aumentar ou diminuir o intervalo de números.
  2. Mudar o tamanho das strings (tipo de VARCHAR(50) pra VARCHAR(100)).
  3. Trocar pra outro tipo de dado pra otimizar (tipo transformar TEXT em VARCHAR).
  4. Erro na escolha do tipo da coluna (tipo você colocou BOOLEAN em vez de INTEGER).

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:

  • USING deixa 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 (TEXTBOOLEAN, VARCHARINTEGER etc).

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 TEXTNUMERIC).

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!

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION