CodeGym /Cursos /SQL SELF /Deletando dados usando DELETE

Deletando dados usando DELETE

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

Deletando dados usando DELETE

Deletar não é só uma função, é uma arte! O importante é apagar só o que precisa, sem ferrar o resto (dados apagados sem querer podem te assombrar nos pesadelos por muito tempo). Hoje a gente vai aprender a fazer isso direitinho, do jeito certo!

Deletar dados é o processo de remover uma ou mais linhas de uma tabela que não fazem mais sentido pro negócio ou pro sistema. Por exemplo, tu precisa apagar registros de estudantes que já terminaram o curso ou que, hmmm, quebraram feio as regras da universidade. Ou, sei lá, tu quer limpar a tabela pra deixar só as infos atualizadas.

Tu vai usar o delete nesses cenários aqui:

  • Deletar dados de usuários que não estão mais ativos.
  • Limpar tabelas de registros temporários.
  • Remover dados duplicados.
  • Apagar registros antigos de acordo com alguma regra de negócio.

Sintaxe do comando DELETE

Pra deletar dados, a gente usa o comando DELETE. Olha a sintaxe básica:

DELETE FROM tabela
WHERE condicao;

Principais partes:

  • DELETE FROM — frase chave que diz que tu vai apagar linhas de uma tabela.
  • tabela — nome da tabela de onde tu quer deletar os dados.
  • WHERE condicao — condição pra filtrar as linhas que vão ser apagadas. Aqui tu pode usar qualquer operador de comparação, operadores lógicos (AND, OR, NOT) e até subqueries.

Exemplo: imagina que a gente tem uma tabela students e quer deletar o estudante com ID = 5:

DELETE FROM students
WHERE id = 5;

Esse comando vai apagar a linha da tabela students onde o id do estudante (coluna id) é 5.

Importante: se tu esquecer de colocar a condição WHERE, o PostgreSQL vai apagar todas as linhas da tabela. Esse vacilo pode ser catastrófico, principalmente se for num sistema de produção.

Deletando todas as linhas de uma tabela

Se tu quiser apagar todas as linhas de uma tabela, pode fazer o comando sem o WHERE. Tipo assim:

DELETE FROM students;

Esse comando apaga todos os registros da tabela students. Mas a estrutura da tabela continua lá — ela só vai ficar vazia.

Alternativa: TRUNCATE

Pra apagar todas as linhas de uma tabela, tu também pode usar o comando TRUNCATE. Ele é mais rápido que o DELETE, porque não registra cada linha apagada no log de transações. Exemplo:

TRUNCATE TABLE students;

Diferenças entre DELETE e TRUNCATE:

  • DELETE registra cada remoção no log de transações, então dá pra desfazer se precisar.
  • TRUNCATE não aceita condição (WHERE) e não registra cada remoção, por isso é mais rápido, mas menos flexível.

Se tu só quer limpar a tabela, TRUNCATE é uma boa. Mas se precisa apagar só parte dos dados ou quer poder desfazer, melhor usar DELETE.

Deletando dados com condições mais complexas

As condições no DELETE podem ser simples ou mais elaboradas, usando operadores lógicos (AND, OR, NOT) ou até subqueries. Bora ver um exemplo.

Exemplo 1: Deletando vários registros Vamos apagar todos os estudantes com mais de 30 anos e que não foram às aulas nos últimos 3 meses:

DELETE FROM students
WHERE age > 30 AND last_attendance_date < (CURRENT_DATE - INTERVAL '3 months');

Esse comando só apaga os estudantes que batem com as duas condições ao mesmo tempo.

Exemplo 2: Deletando usando subquery

Digamos que a gente tem uma tabela failed_students com os IDs dos estudantes expulsos por baixo desempenho. Precisamos apagar eles da tabela principal students:

DELETE FROM students
WHERE id IN (SELECT student_id FROM failed_students);

Aqui a subquery retorna todos os IDs da tabela failed_students, e o DELETE apaga as linhas correspondentes da tabela students.

Dica

Antes de apagar qualquer coisa, escreve um SELECT que mostra os dados que tu quer deletar. Depois é só trocar o SELECT por DELETE e ele vai apagar as mesmas linhas que tu acabou de ver.

Exemplo prático

Imagina que o estudante com ID = 7 resolveu trocar de universidade. Vamos apagar todos os dados dele da nossa tabela:

DELETE FROM students
WHERE id = 7;

Confere a tabela depois de rodar o comando pra garantir que o registro foi mesmo apagado:

SELECT * FROM students WHERE id = 7;

Se não tiver mais nenhum registro com ID = 7, o delete rolou certinho.

Avisos e erros comuns

Esqueceu o WHERE

Um dos erros mais comuns com DELETE é esquecer o WHERE. Isso apaga todas as linhas da tabela, o que pode ser um desastre. Sempre confere teus comandos antes de rodar.

Exemplo de vacilo:

DELETE FROM students;
-- Erro! Apagou todos os estudantes.

Pra evitar esse tipo de erro, sempre testa a condição do WHERE com um SELECT antes de rodar o DELETE. Tipo assim:

SELECT * FROM students WHERE id = 5;

Se o resultado for o que tu espera, aí sim pode rodar o DELETE tranquilo.

Deletando dados relacionados

Se a tabela tem chave estrangeira (FOREIGN KEY), pode dar erro ao deletar dados. Isso acontece se a linha que tu quer apagar tá ligada a outros registros. Por exemplo, se o estudante tá matriculado em algum curso na tabela enrollments, o PostgreSQL não vai deixar tu apagar ele da tabela students.

Pra resolver isso, tu pode:

  1. Usar delete em cascata ON DELETE CASCADE quando criar a chave estrangeira.
  2. Apagar os registros relacionados na mão antes de apagar da tabela principal.

Exemplo de delete manual dos dados relacionados:

-- primeiro apaga os dados do estudante 5 da tabela enrollments
DELETE FROM enrollments
WHERE student_id = 5;

-- depois apaga o próprio estudante 5
DELETE FROM students
WHERE id = 5;

Deletando com transações

Pra operações críticas de delete, é bom usar transações. Assim tu pode desfazer tudo se der ruim.

Exemplo de delete dentro de uma transação:

BEGIN;

DELETE FROM students
WHERE id = 42;

-- Confere o resultado
SELECT * FROM students WHERE id = 42;

-- Se estiver tudo certo, confirma
COMMIT;

-- Se não, desfaz
-- ROLLBACK;

Mais sobre transações nas próximas aulas :P

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