Pular para o conteúdo

A primeira escola especializada em tecnologia do Alto Solimões, com corpo técnico formado na área.

Modulo 2: CRUD Basico

Atualizando Dados

UPDATE SET para modificar registros existentes

UPDATE -- alterando registros

O UPDATE modifica dados existentes no banco. A sintaxe e simples:

UPDATE tabela SET coluna = novo_valor WHERE condicao;

Atualizando um unico campo

-- Atualizar o email de um usuario especifico
UPDATE usuarios SET email = '[email protected]' WHERE id = 1;

-- Mudar o status de um pedido
UPDATE pedidos SET status = 'enviado' WHERE id = 42;

-- Aumentar o preco de um produto
UPDATE produtos SET preco = 29.90 WHERE id = 15;

Atualizando multiplos campos

Separe os campos com virgula no SET:

-- Atualizar nome e email ao mesmo tempo
UPDATE usuarios
SET nome = 'Joao Silva',
email = '[email protected]',
atualizado_em = NOW()
WHERE id = 1;

-- Atualizar endereco completo
UPDATE clientes
SET rua = 'Av Paulista',
numero = '1000',
cidade = 'Sao Paulo',
estado = 'SP'
WHERE id = 25;

UPDATE com condicoes mais complexas

Voce pode usar qualquer filtro que usaria no SELECT:

-- Desativar usuarios que nao fazem login ha 1 ano
UPDATE usuarios
SET status = 'inativo'
WHERE ultimo_login < NOW() - INTERVAL '1 year';

-- Aplicar desconto em produtos de uma categoria
UPDATE produtos
SET preco = preco * 0.90 -- 10% de desconto
WHERE categoria = 'eletronicos'
AND estoque > 100;

-- Corrigir emails errados
UPDATE usuarios
SET email = REPLACE(email, '@gmal.com', '@gmail.com')
WHERE email LIKE '%@gmal.com';

A tecnica do SELECT antes do UPDATE

Antes de rodar qualquer UPDATE, teste com SELECT usando o mesmo WHERE:

-- PASSO 1: Veja quais registros serao afetados
SELECT id, nome, status FROM usuarios
WHERE ultimo_login < NOW() - INTERVAL '1 year';
-- → Confira se sao os registros corretos!

-- PASSO 2: So entao execute o UPDATE
UPDATE usuarios
SET status = 'inativo'
WHERE ultimo_login < NOW() - INTERVAL '1 year';

UPDATE com RETURNING (PostgreSQL)

No PostgreSQL, voce pode ver os registros afetados sem precisar de um SELECT separado:

UPDATE usuarios
SET status = 'ativo'
WHERE id = 5
RETURNING id, nome, status;
-- → 5 | Maria Santos | ativo

No Prisma

// Atualizar um registro (exige campo unico no where)
const usuario = await prisma.usuario.update({
where: { id: 1 },
data: {
nome: 'Joao Silva',
email: '[email protected]'
}
})

// Atualizar varios registros de uma vez
const desativados = await prisma.usuario.updateMany({
where: {
ultimoLogin: { lt: new Date('2025-01-01') }
},
data: { status: 'inativo' }
})
// → desativados.count = numero de registros afetados

// Incrementar valor
const produto = await prisma.produto.update({
where: { id: 15 },
data: {
estoque: { increment: 10 },
preco: { multiply: 0.90 } // 10% de desconto
}
})

No Drizzle

import { eq, lt, and } from 'drizzle-orm'

// Atualizar um registro
await db.update(usuarios)
.set({
nome: 'Joao Silva',
email: '[email protected]'
})
.where(eq(usuarios.id, 1))

// Atualizar com RETURNING
const [atualizado] = await db.update(usuarios)
.set({ status: 'ativo' })
.where(eq(usuarios.id, 5))
.returning()

// Atualizar varios registros
await db.update(usuarios)
.set({ status: 'inativo' })
.where(lt(usuarios.ultimoLogin, new Date('2025-01-01')))

// Atualizar com expressao SQL
import { sql } from 'drizzle-orm'
await db.update(produtos)
.set({ preco: sql`${produtos.preco} * 0.90` })
.where(eq(produtos.categoria, 'eletronicos'))

No Lucid (AdonisJS)

// Atualizar via model (busca + salva)
const usuario = await Usuario.findOrFail(1)
usuario.nome = 'Joao Silva'
usuario.email = '[email protected]'
await usuario.save()

// Atualizar direto com merge
const usuario = await Usuario.findOrFail(1)
usuario.merge({ nome: 'Joao Silva', email: '[email protected]' })
await usuario.save()

// Atualizar varios registros via query builder
const afetados = await Usuario.query()
.where('ultimo_login', '<', '2025-01-01')
.update({ status: 'inativo' })
// → afetados = numero de linhas afetadas

// Atualizar com expressao SQL
const { default: Database } = await import('@adonisjs/lucid/services/db')
await Database.from('produtos')
.where('categoria', 'eletronicos')
.update({ preco: Database.raw('preco * 0.90') })

Exercicios

  1. Escreva uma query que aumente o preco de todos os produtos da categoria "alimentos" em 5%.
  2. Atualize o status para "cancelado" em todos os pedidos com mais de 30 dias e status "pendente".
  3. Corrija o telefone de um usuario especifico (id = 42), adicionando tambem a data da atualizacao.
  4. Usando a tecnica do SELECT primeiro, escreva as duas queries (SELECT de teste + UPDATE) para desativar usuarios sem email.
  5. Implemente a mesma atualizacao do exercicio 2 usando Prisma, Drizzle e Lucid.

Referencias

Testa o que você leu

5 perguntas sobre esta aula. Errar aqui não custa nada - a explicação vem junto da correção.

Pergunta 1 de 5
O que acontece ao executar um `UPDATE` sem `WHERE`?