Contenido de esta guía
Qué elimina TRUNCATE TABLE
TRUNCATE TABLE elimina todas las filas de una tabla sin eliminar la tabla. Sus columnas, restricciones e índices continúan existiendo.
No permite WHERE: la operación siempre afecta al conjunto completo. Por eso debe reservarse para situaciones en las que realmente quieres vaciar la tabla, como datos temporales o una carga de prueba que se va a reconstruir.
Sintaxis básica
TRUNCATE TABLE sesiones_temporales;Antes de ejecutar una operación destructiva, comprueba el objeto y el volumen afectado:
SELECT COUNT(*) AS filas_actuales
FROM sesiones_temporales;| Consulta | Resultado | Decisión |
|---|---|---|
COUNT(*) FROM pedidos | 18 filas | TRUNCATE afectaría a las 18 |
| Pedidos cancelados | 3 filas | Usa DELETE ... WHERE si solo quieres esas tres |
Una comprobación previa convierte una intención vaga («limpiar pedidos») en una decisión medible. Si el número no coincide con lo esperado, detén la operación.
TRUNCATE, DELETE y DROP
| Operación | Filas | Estructura | Permite filtro |
|---|---|---|---|
DELETE | Algunas o todas | Se conserva | Sí, con WHERE |
TRUNCATE TABLE | Todas | Se conserva | No |
DROP TABLE | Todas | Se elimina | No |
La diferencia no es solo de velocidad. Los permisos, desencadenadores, claves foráneas, contadores de identidad y transacciones pueden comportarse de forma distinta.
No supongas que siempre puede deshacerse. PostgreSQL y SQL Server permiten revertir TRUNCATE dentro de una transacción en sus condiciones documentadas. MySQL lo trata como DDL, provoca una confirmación implícita y no permite revertirlo como una operación DML normal.
Error frecuente
Usarlo como sustituto de DELETE con filtro
TRUNCATE TABLE pedidos WHERE estado = 'cancelado' no es válido. Si necesitas conservar parte de las filas, utiliza DELETE ... WHERE ... y revisa primero la selección equivalente.
También puede fallar cuando otras tablas hacen referencia a la tabla mediante claves foráneas. Las reglas exactas y las opciones como CASCADE dependen del motor.
Comprueba lo aprendido
Elige la operación y demuestra su alcance
La tabla pedidos contiene 18 filas, de las que 3 están canceladas. Quieres retirar solo las canceladas y conservar las demás. Escribe primero la consulta de comprobación y después la operación adecuada.
estado.TRUNCATE no admite WHERE.SELECT y DELETE.Solución razonada
BEGIN;
SELECT id, cliente_id, estado
FROM pedidos
WHERE estado = 'cancelado'
ORDER BY id;
DELETE FROM pedidos
WHERE estado = 'cancelado';
SELECT COUNT(*) AS cancelados_restantes
FROM pedidos
WHERE estado = 'cancelado';
ROLLBACK;La primera consulta devuelve los pedidos 103, 108 y 116. DELETE retira temporalmente esas tres filas y la comprobación debe devolver 0; ROLLBACK restaura el estado original del laboratorio. TRUNCATE TABLE pedidos vaciaría las 18 filas y además puede verse bloqueado por claves foráneas desde detalle_pedido y pagos. En un cambio real, sustituye el ROLLBACK por COMMIT únicamente después de verificar que la operación es la prevista y de comprobar la sintaxis transaccional de tu motor.
Compatibilidad entre motores
PostgreSQL, MySQL, SQL Server y Oracle incluyen TRUNCATE TABLE, pero no comparten todos sus efectos. PostgreSQL puede revertirlo dentro de una transacción y ofrece RESTART IDENTITY y CASCADE; también adquiere un bloqueo exclusivo. MySQL lo trata como DDL, realiza una confirmación implícita y recrea la tabla. SQL Server reinicia identidades y permite reversión dentro de una transacción. SQLite no implementa TRUNCATE TABLE; utiliza DELETE FROM tabla, con una optimización interna cuando no existe filtro.
Qué debes recordar
TRUNCATE TABLEelimina todas las filas y conserva la tabla.- No admite
WHERE. - Su reversión, permisos y efectos sobre identidades cambian entre motores.
- Comprueba claves foráneas y realiza una verificación previa antes de ejecutarlo.