SQL DELETE: eliminar filas de una tabla
Lección 8.3 · Tiempo de lectura: ~6 min · Tareas de práctica ↓
La sentencia SQL DELETE elimina filas de una tabla. En esta lección aprenderás la sintaxis DELETE ... WHERE, cómo eliminar filas según una condición en otra tabla, por qué las claves foráneas a veces bloquean un borrado, cómo revisar un DELETE antes de ejecutarlo y en qué se diferencia de TRUNCATE.
DELETE es la última de las tres sentencias que modifican datos. Es la más fácil de escribir y la más peligrosa: una sola condición olvidada elimina todas las filas de una tabla. Las reglas de esta lección sirven para borrar exactamente las filas que quieres.
Las bases de datos de ejemplo de SQLtest son de solo lectura, así que allí estas sentencias devuelven un error de permisos. Los ejemplos usan el esquema Sakila.
Sintaxis de DELETE
DELETE FROM table_name
WHERE condition;
DELETE FROMindica la tabla.WHEREselecciona las filas a eliminar. SinWHERE, se eliminan todas las filas.- Solo se eliminan las filas: la tabla, sus columnas e índices se conservan.
Eliminar filas según una condición
DELETE FROM payment
WHERE payment_date < '2005-05-25';
Resultado: se eliminan todos los pagos hechos antes del 25 de mayo de 2005.
Eliminar por la clave primaria borra exactamente una fila:
DELETE FROM payment
WHERE payment_id = 16049;
Eliminar según una condición en otra tabla
Una subconsulta en WHERE selecciona filas según datos de otras tablas. Eliminemos los pagos de los clientes inactivos:
DELETE FROM payment
WHERE customer_id IN (
SELECT customer_id
FROM customer
WHERE active = 0
);
Resultado: se eliminan todos los pagos de los 15 clientes inactivos.
Igual que con UPDATE, MySQL y MariaDB no permiten que la subconsulta lea la tabla de la que se elimina. MySQL también admite una forma de varias tablas: DELETE p FROM payment AS p INNER JOIN customer AS c ON c.customer_id = p.customer_id WHERE c.active = 0;.
Las claves foráneas pueden bloquear un DELETE
Otras tablas referencian a los clientes: rental y payment guardan customer_id. En Sakila estas claves foráneas están definidas con ON DELETE RESTRICT, así que la base de datos se niega a eliminar un cliente que todavía tiene alquileres o pagos:
DELETE FROM customer
WHERE customer_id = 1;
Resultado: un error "Cannot delete or update a parent row: a foreign key constraint fails". El cliente se queda.
Esto protege los datos: si no, habría alquileres que apuntan a un cliente que ya no existe. Para eliminar a ese cliente, primero borra o reasigna las filas dependientes, o la clave foránea tiene que estar definida con ON DELETE CASCADE, que las elimina automáticamente. Aprenderás las opciones de las claves foráneas junto con CREATE TABLE en la lección 9.1.
Revisar antes de eliminar
- Ejecuta un
SELECTcon el mismoWHEREy mira las filas. - Ejecuta el
DELETEy compara la cantidad de filas afectadas.
-- 1. ¿Qué filas se van a eliminar?
SELECT payment_id, customer_id, amount, payment_date
FROM payment
WHERE payment_date < '2005-05-25';
-- 2. Eliminar exactamente esas filas
DELETE FROM payment
WHERE payment_date < '2005-05-25';
En producción, ejecuta los borrados importantes dentro de una transacción y asegúrate de tener una copia de seguridad. Muchos sistemas directamente no borran datos de negocio: marcan las filas como eliminadas (active = 0, deleted_at), lo que se llama borrado lógico (soft delete).
DELETE sin WHERE y TRUNCATE
DELETE FROM table_name; elimina todas las filas pero conserva la tabla. TRUNCATE TABLE table_name; hace lo mismo mucho más rápido, pero funciona de otra manera:
DELETE | TRUNCATE | |
|---|---|---|
| Puede eliminar solo algunas filas | Sí, con WHERE | No, siempre todas |
| Velocidad en tablas grandes | Más lento, fila por fila | Rápido |
| Reinicia el autoincremento | No | Sí |
| Lo bloquean las claves foráneas | Solo para filas referenciadas | Si cualquier tabla referencia a esta |
Aprenderás TRUNCATE y DROP TABLE en la lección 9.3.
Conclusiones clave:
DELETE FROM table WHERE conditionelimina las filas que coinciden; la tabla se conserva.- Sin
WHERE, se eliminan todas las filas. - Una subconsulta en
WHEREelimina según condiciones en otras tablas. - Las claves foráneas con
RESTRICTbloquean el borrado de filas que todavía se referencian. - Revisa primero con
SELECT; usa transacciones y copias de seguridad en los borrados importantes. - Para vaciar rápidamente una tabla entera, usa
TRUNCATE.
Preguntas frecuentes
¿Qué pasa si ejecuto DELETE sin WHERE?
Se eliminan todas las filas de la tabla; la tabla vacía se conserva. Salvo que la sentencia se haya ejecutado en una transacción que puedas deshacer, los datos solo se pueden recuperar desde una copia de seguridad.
¿Por qué no puedo eliminar una fila en SQL?
Normalmente por una clave foránea: otra tabla todavía referencia la fila. Primero elimina o cambia las filas dependientes, o define la clave foránea con ON DELETE CASCADE.
¿Cuál es la diferencia entre DELETE y TRUNCATE?
DELETE elimina las filas una por una y puede usar WHERE; TRUNCATE elimina todas las filas de una vez, es mucho más rápido y reinicia el contador de autoincremento.