⏳ ¡Últimos días de octubre! SQLtest.online es gratuito gracias a las donaciones, y aún necesitamos alcanzar la meta de este mes para que el sitio siga funcionando en noviembre. Cada donación cuenta. Apoyar ahora →
Código SQL copiado al portapapeles

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.

SQL DELETE: WHERE selecciona las filas a eliminar, la estructura de la tabla se conserva, y una clave foránea bloquea el borrado de filas que otras tablas referencian

Sintaxis de DELETE

DELETE FROM table_name
WHERE condition;
  • DELETE FROM indica la tabla.
  • WHERE selecciona las filas a eliminar. Sin WHERE, 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

  1. Ejecuta un SELECT con el mismo WHERE y mira las filas.
  2. Ejecuta el DELETE y 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:

DELETETRUNCATE
Puede eliminar solo algunas filasSí, con WHERENo, siempre todas
Velocidad en tablas grandesMás lento, fila por filaRápido
Reinicia el autoincrementoNoSí
Lo bloquean las claves foráneasSolo para filas referenciadasSi cualquier tabla referencia a esta

Aprenderás TRUNCATE y DROP TABLE en la lección 9.3.


Conclusiones clave:

  • DELETE FROM table WHERE condition elimina las filas que coinciden; la tabla se conserva.
  • Sin WHERE, se eliminan todas las filas.
  • Una subconsulta en WHERE elimina según condiciones en otras tablas.
  • Las claves foráneas con RESTRICT bloquean 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.

Intenta resolver las siguientes tareas para reforzar lo que aprendiste en esta lección.

  1. Eliminar Registros de Clientes
  2. Eliminar Registros de Pingüinos
  3. Eliminar Registros de Empleados
  4. Eliminar Registros de Películas