Atualizando e Excluindo Dados
Intermediário • 60 minutos • Operações críticas
Aprenda a modificar e remover dados existentes usando UPDATE e DELETE, com foco em segurança e boas práticas.
Objetivos de Aprendizagem
- Dominar o comando UPDATE para modificar dados
- Usar o comando DELETE para remover registros
- Aplicar filtros WHERE com segurança
- Entender transações e rollback
- Conhecer boas práticas de segurança
⚠️ ATENÇÃO: Operações Perigosas!
UPDATE e DELETE são comandos irreversíveis que podem modificar ou apagar dados permanentemente.
- • SEMPRE use WHERE para limitar o escopo
- • TESTE com SELECT antes de executar
- • FAÇA BACKUP antes de operações em massa
- • USE TRANSAÇÕES para operações críticas
Comando UPDATE
O comando UPDATE modifica dados existentes em uma tabela. É usado para corrigir informações, atualizar status, ajustar preços, etc.
Sintaxe Básica
UPDATE nome_tabela
SET coluna1 = valor1,
coluna2 = valor2
WHERE condição;
🔧 Componentes do UPDATE:
- UPDATE: Comando principal
- SET: Define quais colunas alterar e seus novos valores
- WHERE: Especifica quais registros modificar (OBRIGATÓRIO!)
Exemplos Práticos
1. Atualizar um único registro
-- Atualizar o email de um cliente específico
UPDATE clientes
SET email = 'novo.email@exemplo.com'
WHERE id = 1;
Modifica apenas o cliente com ID = 1
2. Atualizar múltiplas colunas
-- Atualizar nome e telefone de um cliente
UPDATE clientes
SET nome = 'João Silva Santos',
telefone = '(11) 99999-9999',
data_atualizacao = NOW()
WHERE id = 1;
Modifica 3 colunas do mesmo registro
3. Atualizar com base em condições
-- Aplicar desconto de 10% em produtos caros
UPDATE produtos
SET preco = preco * 0.9
WHERE preco > 1000;
Afeta todos os produtos com preço maior que R$ 1000
4. Atualizar com subconsulta
-- Marcar pedidos como 'entregue' para clientes de SP
UPDATE pedidos
SET status = 'entregue'
WHERE cliente_id IN (
SELECT id FROM clientes WHERE cidade = 'São Paulo'
);
Usa subconsulta para definir quais registros atualizar
Dica de Segurança:
Sempre teste sua condição WHERE com SELECT antes de fazer UPDATE:
-- TESTE primeiro
SELECT * FROM produtos WHERE preco > 1000;
-- Depois execute o UPDATE
UPDATE produtos SET preco = preco * 0.9 WHERE preco > 1000;
Comando DELETE
O comando DELETE remove registros de uma tabela. É uma operação irreversível que deve ser usada com extremo cuidado.
Sintaxe Básica
DELETE FROM nome_tabela
WHERE condição;
🚨 PERIGO: DELETE sem WHERE
-- NUNCA FAÇA ISSO!
DELETE FROM clientes; -- Apaga TODOS os clientes!
Sem WHERE, o DELETE remove TODOS os registros da tabela!
Exemplos Práticos
1. Deletar um registro específico
-- Remover um cliente específico
DELETE FROM clientes
WHERE id = 5;
Remove apenas o cliente com ID = 5
2. Deletar com múltiplas condições
-- Remover produtos descontinuados e sem estoque
DELETE FROM produtos
WHERE status = 'descontinuado'
AND estoque = 0;
Remove produtos que atendem ambas as condições
3. Deletar com subconsulta
-- Remover pedidos de clientes inativos
DELETE FROM pedidos
WHERE cliente_id IN (
SELECT id FROM clientes WHERE status = 'inativo'
);
Remove pedidos baseado em condição de outra tabela
4. Deletar registros antigos
-- Remover logs antigos (mais de 30 dias)
DELETE FROM logs
WHERE data_criacao < NOW() - INTERVAL '30 days';
Limpeza automática de dados antigos
Protocolo de Segurança para DELETE:
- 1. SELECT primeiro: Veja quais registros serão afetados
- 2. Conte os registros: Use COUNT(*) para confirmar quantidade
- 3. Backup: Faça backup dos dados importantes
- 4. Execute: Só então execute o DELETE
-- 1. Veja os dados
SELECT * FROM produtos WHERE status = 'descontinuado';
-- 2. Conte quantos serão afetados
SELECT COUNT(*) FROM produtos WHERE status = 'descontinuado';
-- 3. Execute o DELETE
DELETE FROM produtos WHERE status = 'descontinuado';
Transações e Rollback
Transações permitem agrupar múltiplas operações e desfazê-las se algo der errado. É uma camada extra de segurança.
Conceitos Básicos
BEGIN
Inicia uma transação
COMMIT
Confirma as alterações
ROLLBACK
Desfaz as alterações
Exemplo Prático
-- Transferir produto entre categorias
BEGIN;
-- 1. Verificar se a categoria destino existe
SELECT id FROM categorias WHERE nome = 'Eletrônicos';
-- 2. Atualizar o produto
UPDATE produtos
SET categoria_id = 2
WHERE id = 10;
-- 3. Verificar se a atualização foi correta
SELECT * FROM produtos WHERE id = 10;
-- Se tudo estiver correto:
COMMIT;
-- Se algo estiver errado:
-- ROLLBACK;
🔄 Fluxo de uma Transação:
- 1. BEGIN: Inicia a transação
- 2. Operações: Execute UPDATE/DELETE/INSERT
- 3. Verificação: Confira se tudo está correto
- 4. COMMIT ou ROLLBACK: Confirma ou desfaz
Boas Práticas de Segurança
✅ Faça SEMPRE
- • Use WHERE em UPDATE e DELETE
- • Teste com SELECT antes de executar
- • Faça backup antes de operações em massa
- • Use transações para operações críticas
- • Valide dados antes de atualizar
- • Use LIMIT em DELETEs grandes
❌ NUNCA faça
- • UPDATE ou DELETE sem WHERE
- • Operações em massa sem backup
- • Modificar dados em produção sem testar
- • Usar dados não validados em UPDATE
- • Executar scripts não testados
⚠️ Cuidado especial
- • Operações que afetam muitos registros
- • UPDATEs que modificam chaves estrangeiras
- • DELETEs em tabelas com relacionamentos
- • Operações durante horário de pico
- • Scripts automatizados
Checklist de Segurança
Exercício Prático
Vamos praticar UPDATE e DELETE com segurança!
Complete as consultas SQL abaixo:
1. Complete o UPDATE para aumentar o preço em 10%:
______ produtos
___ preco = preco * 1.1
_____ categoria_id = 2;
2. Qual comando você usaria ANTES de executar um DELETE?
3. Complete o DELETE para remover produtos sem estoque:
______ ____ produtos
_____ estoque = 0;
4. O que acontece se você executar DELETE sem WHERE?
Erros Comuns e Como Evitar
❌ Esquecer WHERE
-- PERIGOSO!
UPDATE produtos SET preco = 0; -- Zera TODOS os preços!
DELETE FROM clientes; -- Remove TODOS os clientes!
Solução: Sempre use WHERE, mesmo que seja WHERE id = id para testar.
❌ WHERE incorreto
-- ERRO: Usar = em vez de IN
UPDATE pedidos SET status = 'cancelado'
WHERE cliente_id = (SELECT id FROM clientes WHERE cidade = 'SP');
-- Se houver múltiplos clientes de SP, dará erro!
Solução: Use IN quando a subconsulta pode retornar múltiplos valores.
❌ Não validar dados
-- PERIGOSO: Não validar se o valor é válido
UPDATE produtos SET preco = -100 WHERE id = 1; -- Preço negativo!
Solução: Adicione validações: WHERE id = 1 AND preco > 0
⚠️ Problemas de performance
-- LENTO: UPDATE sem índice
UPDATE produtos SET categoria_id = 2 WHERE nome LIKE '%notebook%';
-- Pode ser muito lento em tabelas grandes
Dica: Use LIMIT para operações em lote e monitore a performance.
Resumo da Aula
- UPDATE modifica dados existentes com SET e WHERE
- DELETE remove registros, sempre com WHERE
- Transações (BEGIN/COMMIT/ROLLBACK) oferecem segurança extra
- Sempre teste com SELECT antes de executar UPDATE/DELETE
- Faça backup antes de operações críticas