CodeGym /Cursos /SQL SELF /Atualizando dados usando UPDATE

Atualizando dados usando UPDATE

SQL SELF
Nível 21 , Lição 2
Disponível

Hoje a gente vai chegar em mais um tijolinho importante do seu novo conhecimento de banco de dados — atualização de dados. Bora ver como mudar informações já existentes no PostgreSQL usando o comando UPDATE. Por que isso é importante? Bom, porque na vida real os dados mudam o tempo todo. Imagina que seu amigo trocou de número de telefone, ou um estudante mudou de turma — claro que você vai querer atualizar isso no banco.

Quando sua paixão da escola, a Svetka Sokolova, de repente virou Svetka Khachaturyan (é, a vida é assim mesmo), isso pede uma alteração no seu banco de dados. Cenários onde você precisa atualizar dados aparecem toda hora:

  • Corrigir erros em algum registro.
  • Atualizar informações (mudança de endereço, alteração de status).
  • Mudar vários dados de uma vez, tipo dar aumento pra galera do trabalho.

Atualizar dados é o jeito de mudar valores de uma ou mais colunas pra uma ou mais linhas da tabela, sem adicionar novos registros.

Sintaxe do comando UPDATE

O comando UPDATE no PostgreSQL tem uma sintaxe bem de boa. Olha só a estrutura:

UPDATE tabela
SET coluna1 = valor1,
    coluna2 = valor2
WHERE condicao;

Explicando:

  • tabela: nome da tabela onde você vai mexer em alguma coisa.
  • SET coluna = valor: define qual coluna você quer mudar e qual valor vai colocar.
  • WHERE condicao: a condição que diz quais linhas devem ser atualizadas (muito importante pra não mudar tudo sem querer).

Detalhe chave: se você esquecer de colocar o WHERE (ou fizer errado), suas mudanças vão afetar todas as linhas da tabela. Isso pode dar ruim demais.

Exemplo: mudando o nome de um estudante

Imagina que temos uma tabela students com as colunas id, name, email. Queremos mudar o nome do estudante com id = 1 pra "Maria Chi".

UPDATE students
SET name = 'Maria Chi'
WHERE id = 1;

Esse comando vai achar a linha com id = 1 e atualizar a coluna name pro novo valor. Moleza, né?

Atualizando várias colunas

Muitas vezes você precisa mudar vários valores de uma vez só. Por exemplo, imagina que o estudante trocou não só o nome, mas também o e-mail. Olha como faz:

UPDATE students
SET name = 'Otto Lin',
    email = 'otto.lin@example.com'
WHERE id = 2;

Aqui a gente atualiza tanto o name quanto o email do estudante com id = 2. O PostgreSQL deixa você colocar várias duplas coluna=valor separadas por vírgula no SET.

Atualizando várias linhas

E se você quiser mudar dados pra várias linhas de uma vez? Tipo, transferir um grupo de estudantes pra outra turma. Dá pra atualizar as linhas que batem com um critério. Suponha que temos o campo group_number e queremos passar todos os estudantes do grupo 101 pro grupo 202:

UPDATE students
SET group_number = 202
WHERE group_number = 101;

Esse comando vai atualizar todas as linhas onde group_number é 101, trocando pra 202.

5. Condição WHERE: cuidado aí!

Como já falei, o WHERE é seu salva-vidas. Sem ele, o comando vai afetar todas as linhas da tabela. Por exemplo, o comando abaixo vai atualizar o GRUPO de todos os estudantes, não só do grupo 101. Isso é exatamente o que você não quer:

UPDATE students
SET group_number = 202;

Pelo amor, sempre coloca o WHERE se não quiser destruir os dados sem querer. Melhor prevenir do que remediar.

Pensa no comando UPDATE como um comando que muda colunas da tabela, não as linhas. O objetivo dele é dar um valor pra todas as células de uma coluna. Só o WHERE faz com que nem todas as linhas sejam alteradas.

Atualizando com base em dados de outra tabela

Às vezes, não basta só "digitar" o valor na mão, mas sim atualizar valores na tabela A usando dados da tabela B. Isso rola bastante — principalmente quando os dados ficam separados: tipo cálculos numa tabela, perfis de usuário em outra.

Suponha que temos a tabela students e precisamos atualizar a coluna debt usando a tabela payments, onde está o valor atual da dívida (due_amount). Cada registro em students tem um correspondente em payments pelo campo student_id.

A sintaxe fica assim:

UPDATE students
SET debt = payments.due_amount
FROM payments
WHERE students.id = payments.student_id;

O que rola aqui:

  • O PostgreSQL usa o FROM payments como fonte dos dados.
  • Pelo WHERE ele liga as linhas das tabelas.
  • Só atualiza as linhas de students que têm correspondência em payments.

Importante entender: dentro desse UPDATE ... FROM rola um JOIN escondido — JOIN, só que sem a palavra JOIN.

O lance é que por baixo dos panos tem um JOIN rolando. Na real, ficaria mais ou menos assim:

UPDATE students
SET debt = p.due_amount
FROM payments p
    JOIN students s ON s.id = p.student_id
WHERE students.id = p.student_id;

Como ver o que vai ser atualizado

Antes de rodar o UPDATE, é muito esperto dar uma olhada no que vai ser alterado. Dá pra fazer isso com um SELECT seguindo a mesma lógica:

SELECT
    students.id, 
    students.name, 
    students.debt AS old_debt, 
    payments.due_amount AS new_debt
FROM students
    JOIN payments ON students.id = payments.student_id;

O resultado mostra:

  • o valor antigo da dívida (old_debt);
  • o novo valor que vem da tabela payments (new_debt).

Esse jeito ajuda a checar se a lógica tá certa antes de sobrescrever os dados pra sempre.

Pegadinhas que podem rolar

  • Se payments tiver mais de um registro pra um estudante, o UPDATE vai dar erro: more than one row returned. Aí tem que usar agregação (MAX, SUM, LIMIT 1) ou garantir que student_id em payments seja único.
  • Lembra que UPDATE ... FROM é uma parada específica do PostgreSQL e não funciona igualzinho em outros bancos (tipo MySQL).

Exemplos práticos

Exemplo 1: Mudando o status dos estudantes

Imagina que estudantes que terminaram o curso ganham status "formado". Temos a coluna status. Pra atualizar o status dos estudantes com completed_course = true:

UPDATE students
SET status = 'formado'
WHERE completed_course = true;

Exemplo 2: Aumentando salário dos funcionários

Se você tem a tabela employees e quer aumentar o salário em 10% pra quem trabalha no departamento de vendas:

UPDATE employees
SET salary = salary * 1.10
WHERE department = 'Sales';

Aqui a gente usa uma operação matemática direto no SET. Bem prático pra mudanças em massa.

Exemplo 3: Atualização condicional

Às vezes você precisa atualizar dados dependendo de uma condição. Tipo, se o salário do funcionário for menor que 50.000, ele aumenta 20%, senão aumenta 10%:

UPDATE employees
SET salary = CASE
                WHEN salary < 50000 THEN salary * 1.20
                ELSE salary * 1.10
             END;

Esse comando usa o CASE pra definir regras diferentes de atualização dependendo do valor do salary.

Erros comuns ao usar UPDATE

Já deve ter sacado qual é o erro mais clássico, né? Isso mesmo: esquecer o WHERE. Imagina a cena: você tem um banco com 10.000 funcionários e, sem querer, aumentou o salário de todo mundo. Pode até ser bom pra galera, mas pra sua carreira... nem tanto.

Outro erro comum é atualizar a coluna errada. Sempre confere o que e onde você tá mexendo. Um SELECT antes do UPDATE pode salvar seu tempo (e sua pele).

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