TRUNCATE TABLE
TRUNCATE TABLE elimina todas las filas de una tabla de forma rápida y eficiente. A diferencia de DELETE, que elimina fila por fila y registra cada eliminación, TRUNCATE descarta los datos de la tabla y recrea la estructura vacía. Es la forma más rápida de vaciar completamente una tabla.
Sintaxis
TRUNCATE TABLE nombre_tabla;La palabra TABLE es opcional pero recomendada para mayor claridad:
TRUNCATE nombre_tabla; -- También válidoEjemplo
Crear una tabla temporal con datos y vaciarla:
CREATE TABLE log_temporal (
id INT AUTO_INCREMENT PRIMARY KEY,
mensaje VARCHAR(200),
fecha DATETIME DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO log_temporal (mensaje) VALUES
('Inicio del proceso'),
('Procesando datos'),
('Fin del proceso');
-- Verificar que tiene datos
SELECT COUNT(*) FROM log_temporal;| COUNT(*) |
|---|
| 3 |
TRUNCATE TABLE log_temporal;
SELECT COUNT(*) FROM log_temporal;| COUNT(*) |
|---|
| 0 |
La tabla queda vacía instantáneamente.
TRUNCATE vs DELETE
Ambos vacían una tabla, pero funcionan de forma muy diferente:
Velocidad: TRUNCATE es mucho más rápido, especialmente con tablas grandes. DELETE elimina fila por fila y registra cada eliminación en el log de transacciones. TRUNCATE descarta las páginas de datos directamente.
AUTO_INCREMENT: TRUNCATE reinicia el contador AUTO_INCREMENT a 1. DELETE no lo reinicia: si el último ID era 100, el siguiente INSERT después del DELETE será 101.
INSERT INTO log_temporal (mensaje) VALUES ('Después de TRUNCATE');
SELECT * FROM log_temporal;| id | mensaje | fecha |
|---|---|---|
| 1 | Después de TRUNCATE | 2025-12-15 10:30:00 |
El ID vuelve a ser 1 gracias al TRUNCATE. Si hubiéramos usado DELETE, el ID sería 4.
Transacciones: DELETE es una operación DML que se puede deshacer con ROLLBACK dentro de una transacción. TRUNCATE es una operación DDL que hace un COMMIT implícito: no se puede deshacer.
Triggers: DELETE activa los triggers de tipo BEFORE DELETE y AFTER DELETE para cada fila. TRUNCATE no activa ningún trigger.
WHERE: DELETE acepta una cláusula WHERE para filtrar qué filas eliminar. TRUNCATE siempre elimina todas las filas, sin posibilidad de filtrar.
Restricciones con claves foráneas
TRUNCATE no funciona en tablas que son referenciadas por claves foráneas de otras tablas, incluso si las tablas referenciantes están vacías:
-- Esto falla porque 'pedidos' referencia a 'clientes'
TRUNCATE TABLE clientes;ERROR 1701 (42000): Cannot truncate a table referenced
in a foreign key constraint
Para vaciar tablas con restricciones de clave foránea, tienes dos opciones:
-- Opción 1: Desactivar temporalmente las restricciones
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE TABLE clientes;
SET FOREIGN_KEY_CHECKS = 1;
-- Opción 2: Eliminar primero las filas dependientes
DELETE FROM pedidos WHERE cliente_id IS NOT NULL;
DELETE FROM clientes;La opción 1 es más rápida pero peligrosa: si hay datos en las tablas dependientes, quedarán registros huérfanos (apuntando a clientes que ya no existen). Solo úsala cuando estés seguro de que las tablas dependientes están vacías o vas a vaciarlas también.
Cuándo usar TRUNCATE
Usa TRUNCATE cuando necesitas vaciar completamente una tabla y reiniciar el AUTO_INCREMENT: tablas de logs, tablas temporales de procesamiento, tablas de staging para importaciones, o tablas de caché.
Usa DELETE cuando necesitas eliminar filas selectivamente (con WHERE), cuando necesitas que se activen triggers, cuando quieres poder deshacer la operación con ROLLBACK, o cuando la tabla tiene claves foráneas activas.
Limpiar
DROP TABLE IF EXISTS log_temporal;En el siguiente artículo veremos los Prepared Statements, que permiten preparar y ejecutar sentencias SQL parametrizadas para mayor seguridad y rendimiento.
Escrito por Eduardo Lázaro
