Saltar al contenido

Mentoring

TRUNCATE TABLE en MySQL: cómo vaciar una tabla

Aprende qué hace TRUNCATE TABLE en MySQL, cuándo usarlo y en qué se diferencia de DELETE.

Mentoring 2 min de lectura

Actualizado el

TRUNCATE TABLE en MySQL

TRUNCATE TABLE vacía por completo una tabla y no admite WHERE. En MySQL realiza un commit implícito y no puede deshacerse con ROLLBACK.

La sintaxis es directa:

TRUNCATE TABLE nombre_tabla;

Ejemplo:

TRUNCATE TABLE logs;

Después de ejecutarlo, la tabla sigue existiendo, pero queda vacía.

Diferencia entre TRUNCATE y DELETE

TRUNCATE y DELETE pueden dejar una tabla sin filas, pero no funcionan igual:

AspectoTRUNCATE TABLE en MySQLDELETE
AlcanceToda la tablaTodas las filas o solo las que cumplan WHERE
Tipo de operaciónDDLDML
TransacciónCommit implícito; no admite rollback del usuarioPuede revertirse en una transacción con un motor transaccional como InnoDB
Triggers DELETENo ejecuta triggers ON DELETESí los dispara
AUTO_INCREMENTReinicia el contadorNormalmente conserva la secuencia
Claves foráneasEn InnoDB y NDB no permite truncar si otra tabla la referencia; sí admite la autorreferenciaSe aplican las reglas de la FK
Permiso relevanteDROPDELETE

Ejemplo con DELETE:

DELETE FROM logs
WHERE fecha < '2024-01-01';

Ejemplo con TRUNCATE:

TRUNCATE TABLE logs;

Usa DELETE si necesitas borrar solo algunas filas. Usa TRUNCATE si quieres vaciar toda la tabla.

Qué debes tener en cuenta

  • Confirma el nombre de la tabla antes de ejecutar la sentencia.
  • En InnoDB y NDB, TRUNCATE no puede vaciar una tabla referenciada por una clave foránea desde otra tabla; una referencia a sí misma es la excepción.
  • Ten una copia de seguridad o una forma clara de reconstruir los datos.
  • En MySQL 8.4, InnoDB admite atomicidad DDL: tras un error o crash del servidor, TRUNCATE se recupera como completado o no aplicado, nunca a medias. Esto no permite deshacerlo con un ROLLBACK manual: TRUNCATE hace commit implícito.

Ejemplo completo

CREATE TABLE pruebas (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(100) NOT NULL
);

INSERT INTO pruebas (nombre)
VALUES ('Ana'), ('Luis'), ('Pedro');

TRUNCATE TABLE pruebas;

SELECT * FROM pruebas;

El SELECT final no devolverá filas.

Cuándo usar TRUNCATE

TRUNCATE TABLE tiene sentido para vaciar datos de prueba, entornos de staging o tablas que se van a regenerar desde cero. En tablas de logs de producción, valora antes si necesitas conservar el histórico o hacer borrados parciales con DELETE.

No lo uses si necesitas conservar parte de los datos o si no tienes clara la relación de esa tabla con el resto de la base de datos.

En SQL Server, a diferencia de MySQL, TRUNCATE TABLE sí puede revertirse dentro de una transacción; no traslades esa expectativa entre motores.