¡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:
DELETEregistra cada borrado en el log de transacciones, lo que te permite deshacerlos si hace falta.TRUNCATEno 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:
- Usar borrado en cascada
ON DELETE CASCADEal crear la clave foránea. - 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
GO TO FULL VERSION