CodeGym /Cursos /SQL SELF /Eliminando datos usando DELETE

Eliminando datos usando DELETE

SQL SELF
Nivel 21 , Lección 3
Disponible

¡Eliminar no es solo una función, es todo un arte! Es importante borrar justo lo que necesitas y no tocar nada más (los datos borrados por accidente pueden perseguirte en tus pesadillas por mucho tiempo). ¡Hoy vamos a aprender a hacerlo con cuidado y como se debe!

Eliminar datos es el proceso de quitar una o varias filas de una tabla que ya no cumplen con la lógica de negocio o los requisitos de tu sistema. Por ejemplo, necesitas borrar registros de estudiantes que ya terminaron sus estudios o que, ejem, rompieron seriamente las reglas de la universidad. O digamos que necesitas limpiar la tabla para dejar solo la info relevante.

La operación de eliminar datos se usa en los siguientes escenarios:

  • Borrar datos de usuarios que ya no están activos.
  • Limpiar tablas de registros temporales.
  • Eliminar datos duplicados.
  • Borrar registros antiguos según cierta lógica de negocio.

Sintaxis del comando DELETE

Para eliminar datos usamos el comando DELETE. Aquí tienes la sintaxis básica:

DELETE FROM tabla
WHERE condición;

Partes principales:

  • DELETE FROM — frase clave que se usa para indicar que quieres borrar filas de una tabla.
  • tabla — el nombre de la tabla de donde quieres borrar datos.
  • WHERE condición — condición para filtrar las filas que quieres borrar. Aquí puedes usar cualquier operador de comparación, operadores lógicos (AND, OR, NOT) e incluso subconsultas.

Ejemplo: imagina que tenemos una tabla students y queremos borrar de ahí al estudiante con ID = 5:

DELETE FROM students
WHERE id = 5;

Esta consulta borra la fila de la tabla students donde el identificador del estudiante (columna id) es igual a 5.

Importante: si olvidas poner la condición WHERE, PostgreSQL va a borrar todas las filas de la tabla. Un error así puede ser catastrófico, sobre todo si estamos hablando de un sistema en producción.

Eliminando todas las filas de una tabla

Si necesitas borrar todas las filas de una tabla, puedes poner la consulta sin la condición WHERE. Por ejemplo:

DELETE FROM students;

Esta consulta borra todos los registros de la tabla students. Pero la estructura de la tabla se queda — no se borra, solo queda vacía.

Alternativa: TRUNCATE

Para borrar todas las filas de una tabla también puedes usar el comando TRUNCATE. Es más rápido que DELETE porque no registra el borrado de cada fila en el log de transacciones. Ejemplo:

TRUNCATE TABLE students;

Diferencias entre DELETE y TRUNCATE:

  • DELETE registra cada borrado en el log de transacciones, lo que te permite deshacerlos si hace falta.
  • TRUNCATE no soporta condiciones (WHERE) y no registra cada borrado individualmente, así que es más rápido pero menos flexible.

Si solo quieres limpiar la tabla, TRUNCATE es una opción genial. Pero si necesitas borrar solo parte de los datos o poder deshacer los cambios, mejor usa DELETE.

Eliminando datos con condiciones complejas

Las condiciones en DELETE pueden ser no solo simples, sino también complejas, usando operadores lógicos (AND, OR, NOT) o incluso subconsultas. Vamos a ver un ejemplo.

Ejemplo 1: Borrar varios registros Vamos a borrar todos los estudiantes cuya edad es mayor de 30 años y que no han asistido a clases en los últimos 3 meses:

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

Esta consulta solo borra a los estudiantes que cumplen ambas condiciones al mismo tiempo.

Ejemplo 2: Borrar usando una subconsulta

Supón que tenemos una tabla failed_students donde guardamos los identificadores de los estudiantes expulsados por bajo rendimiento académico. Necesitamos borrarlos de la tabla principal students:

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

Aquí la subconsulta devuelve todos los identificadores de estudiantes de la tabla failed_students, y el comando DELETE borra las filas correspondientes de la tabla students.

Recomendación

Antes de borrar algo, escribe un SELECT que muestre los datos que quieres borrar. Luego simplemente cambia la parte de SELECT por DELETE y así borrarás las mismas filas que acabas de ver.

Ejemplo práctico

Imagina que el estudiante con ID = 7 decidió cambiar de universidad. Vamos a borrar todos sus datos de nuestra tabla:

DELETE FROM students
WHERE id = 7;

Revisa la tabla después de ejecutar el comando para asegurarte de que el registro realmente se borró:

SELECT * FROM students WHERE id = 7;

Si ya no hay registros con ID = 7, la operación de borrado fue exitosa.

Advertencias y errores típicos

Sección WHERE olvidada

Uno de los errores más comunes al trabajar con DELETE es olvidarse de la sección WHERE. Esto lleva a borrar todas las filas de la tabla, lo que puede ser un desastre total. Siempre revisa tus consultas antes de ejecutarlas.

Ejemplo de una situación por despiste:

DELETE FROM students;
-- ¡Error! Se borran todos los estudiantes.

Para evitar este tipo de errores, se recomienda siempre probar la condición WHERE con un comando SELECT antes de ejecutar DELETE. Por ejemplo:

SELECT * FROM students WHERE id = 5;

Si el resultado te convence, entonces puedes ejecutar DELETE sin miedo.

Borrando datos relacionados

Si la tabla tiene claves foráneas (FOREIGN KEY), al borrar datos puede aparecer un error. Esto pasa si la fila que quieres borrar está relacionada con otros registros. Por ejemplo, si un estudiante está inscrito en un curso en la tabla enrollments, PostgreSQL no te dejará borrarlo de la tabla students.

Para solucionar esto, puedes:

  1. Usar borrado en cascada ON DELETE CASCADE al crear la clave foránea.
  2. Borrar los registros relacionados manualmente antes de borrar el registro de la tabla principal.

Ejemplo de borrado manual de datos relacionados:

-- primero borramos los datos del estudiante 5 de la tabla enrollments
DELETE FROM enrollments
WHERE student_id = 5;

-- luego borramos al propio estudiante 5
DELETE FROM students
WHERE id = 5;

Borrando con transacciones

Para operaciones de borrado críticas se recomienda usar transacciones. Así puedes deshacer los cambios si algo sale mal.

Ejemplo de borrado en una transacción:

BEGIN;

DELETE FROM students
WHERE id = 42;

-- Revisamos el resultado
SELECT * FROM students WHERE id = 42;

-- Si todo está bien, guardamos los cambios
COMMIT;

-- Si no, deshacemos
-- ROLLBACK;

Más sobre transacciones en las próximas lecciones :P

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION