7

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

⚠️ 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. 1. SELECT primeiro: Veja quais registros serão afetados
  2. 2. Conte os registros: Use COUNT(*) para confirmar quantidade
  3. 3. Backup: Faça backup dos dados importantes
  4. 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. 1. BEGIN: Inicia a transação
  2. 2. Operações: Execute UPDATE/DELETE/INSERT
  3. 3. Verificação: Confira se tudo está correto
  4. 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
Aula Anterior: Consultas com JOIN Próxima Aula: Funções de Agregação