Atualizando Dados
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
- Escreva uma query que aumente o preco de todos os produtos da categoria "alimentos" em 5%.
- Atualize o status para "cancelado" em todos os pedidos com mais de 30 dias e status "pendente".
- Corrija o telefone de um usuario especifico (id = 42), adicionando tambem a data da atualizacao.
- Usando a tecnica do SELECT primeiro, escreva as duas queries (SELECT de teste + UPDATE) para desativar usuarios sem email.
- 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.