Contenido de esta guía
Qué hace DELETE
DELETE elimina filas de una tabla y conserva su estructura. WHERE define el alcance; sin esa cláusula, todas las filas son candidatas.
Antes de borrar, comprueba la selección con SELECT, revisa relaciones y ejecuta la operación dentro de una transacción cuando el motor y el entorno lo permitan.
Sintaxis y flujo seguro
DELETE FROM tabla
WHERE condicion;- Escribe un
SELECTcon la misma condición. - Comprueba cantidad e identidad de las filas.
- Inicia una transacción de prueba.
- Ejecuta
DELETEy vuelve a comprobar. - Usa
COMMIToROLLBACKde forma consciente.
Ejemplo guiado: cliente inactivo sin pedidos
Primero buscamos una fila que cumpla dos reglas: estar inactiva y no tener pedidos relacionados.
SELECT id, nombre, activo
FROM clientes
WHERE activo = 0
AND NOT EXISTS (
SELECT 1
FROM pedidos
WHERE pedidos.cliente_id = clientes.id
);| id | nombre | activo |
|---|---|---|
| 6 | Pablo Sanz | 0 |
En una copia de práctica, el borrado reversible sería:
BEGIN;
DELETE FROM clientes
WHERE activo = 0
AND NOT EXISTS (
SELECT 1
FROM pedidos
WHERE pedidos.cliente_id = clientes.id
);
SELECT COUNT(*) AS sigue_existiendo
FROM clientes
WHERE id = 6;
ROLLBACK;La comprobación devuelve 0 dentro de la transacción y la fila reaparece después de ROLLBACK.
Qué ocurre con las relaciones
Una clave foránea puede impedir el borrado o aplicar una acción configurada, como borrar filas dependientes o establecer la referencia a NULL. No asumas el comportamiento: revisa la definición de la restricción antes de eliminar una fila principal.
Error frecuente
Ejecutar el DELETE antes de medir el alcance
DELETE FROM pedidos;La sentencia elimina todas las filas. Aunque ese sea el objetivo, confirma antes el conteo, las dependencias, la copia de seguridad y el comportamiento transaccional del motor.
Comprueba lo aprendido
Selecciona clientes sin email ni pedidos
En el laboratorio SQLite o en una copia desechable, elimina clientes cuyo email sea NULL y que no tengan pedidos. Ejecuta primero el SELECT equivalente y termina con ROLLBACK para que la práctica no conserve el borrado. La base actual contiene dos candidatas.
email IS NULL.NOT EXISTS para descartar clientes con pedidos.SELECT y DELETE.Solución razonada
BEGIN;
SELECT id, nombre
FROM clientes
WHERE email IS NULL
AND NOT EXISTS (
SELECT 1 FROM pedidos
WHERE pedidos.cliente_id = clientes.id
)
ORDER BY id;
DELETE FROM clientes
WHERE email IS NULL
AND NOT EXISTS (
SELECT 1 FROM pedidos
WHERE pedidos.cliente_id = clientes.id
);
SELECT COUNT(*) AS candidatas_restantes
FROM clientes
WHERE email IS NULL
AND NOT EXISTS (
SELECT 1 FROM pedidos
WHERE pedidos.cliente_id = clientes.id
);
ROLLBACK;| id | nombre |
|---|---|
| 6 | Pablo Sanz |
| 12 | Mario Gil |
La comprobación previa selecciona a Pablo Sanz y Mario Gil. Tras el DELETE, el conteo baja a 0 dentro de la transacción; ROLLBACK restaura ambas filas.
Compatibilidad entre motores
DELETE FROM ... WHERE ... es común. Las cláusulas para limitar filas, unir otras tablas o devolver lo borrado cambian entre motores. SQLite puede optimizar internamente un borrado total sin filtros; esa optimización no reduce la necesidad de confirmar el alcance.
Qué debes recordar
DELETEelimina filas, no la tabla.- Sin
WHERE, todas las filas son candidatas. - Comprueba el filtro con
SELECT. - Las claves foráneas pueden bloquear o propagar el borrado.