truncado-tablas-truncate-table

Truncado de tablas TRUNCATE TABLE

  • 4 min

El comando TRUNCATE TABLE es una operación que elimina rápida y completamente todas las filas de una tabla al liberar las páginas de almacenamiento de datos, en lugar de procesar y registrar cada eliminación individualmente.

En el artículo anterior aprendimos a borrar datos con DELETE. Vimos que si ejecutamos un DELETE FROM Tabla sin WHERE, borramos todas las filas.

Entonces, si queremos limpiar una tabla entera, ¿usamos DELETE? La respuesta es: si te importa el rendimiento, NO.

Para vaciar una tabla por completo, SQL Server nos ofrece un comando especializado, mucho más rápido y drástico, TRUNCATE TABLE.

CaracterísticaDELETE (sin WHERE)TRUNCATE TABLE
VelocidadLento (proporcional al nº de filas)Muy rápido (constante)
Log de TransaccionesAlto (registra cada fila)Mínimo (registra páginas)
FiltrosPermite WHERETodo o nada
IdentityNo reinicia el contadorReinicia a la semilla
Foreign KeysPermitido (si no hay hijos)Bloqueado si existe la relación
TriggersSe ejecutanSe ignoran

Si DELETE es un operación “fina y elegante” que opera fila a fila, TRUNCATE es una bola de demolición.

¿Qué es TRUNCATE TABLE?

TRUNCATE TABLE elimina todas las filas de una tabla, pero mantiene intacta la estructura de la misma (columnas, restricciones, índices, etc.).

La sintaxis es extremadamente sencilla:

TRUNCATE TABLE Pedidos;
Copied!

A efectos prácticos, el resultado visual es el mismo que un DELETE sin WHERE: la tabla se queda vacía. Sin embargo, internamente funcionan de forma muy distinta.

Diferencias clave con DELETE

Entender la diferencia entre estos dos comandos es una pregunta clásica de entrevista técnica. Aquí están los puntos clave:

Rendimiento y Log de Transacciones

Esta es la gran diferencia.

  • DELETE: Es una operación registrada fila por fila. Si borras 1 millón de registros, SQL Server escribe 1 millón de entradas en el log de transacciones (“he borrado la fila 1”, “he borrado la fila 2”…). Esto es lento y llena el disco.
  • TRUNCATE: Es una operación registrada a nivel de página de datos. En lugar de borrar las filas una a una, simplemente marca las páginas de disco donde estaban los datos como “libres”. Es casi instantáneo, sin importar si hay 10 filas o 10 millones.

Reinicio de columnas IDENTITY

Si tienes una columna autoincremental (IDENTITY), el comportamiento cambia:

  • DELETE: No reinicia el contador. Si borraste hasta el ID 100, el siguiente registro que insertes será el 101.
  • TRUNCATE: Reinicia** el contador a su valor semilla original (generalmente 1). El siguiente registro volverá a ser el 1.

Si estás limpiando tablas en un entorno de pruebas y quieres empezar de cero “de verdad” (con los IDs desde el 1), usa siempre TRUNCATE.

Triggers

  • DELETE: Activa los triggers definidos como ON DELETE.
  • TRUNCATE: No activa los triggers ON DELETE. Como la operación no borra fila a fila, el motor no se molesta en avisar a los disparadores.

Restricciones: Cuando NO puedes usar TRUNCATE

A pesar de ser maravilloso por su velocidad, TRUNCATE tiene una limitación muy importante relacionada con la integridad referencial.

No puedes ejecutar TRUNCATE sobre una tabla que sea referenciada por una Foreign Key.

Incluso si la tabla hija está vacía, SQL Server no te dejará.

-- Si 'Pedidos' tiene una FK apuntando a 'Clientes'...
TRUNCATE TABLE Clientes;
Copied!

Error: Cannot truncate table ‘Clientes’ because it is being referenced by a FOREIGN KEY constraint.

¿La solución? Para truncar una tabla padre, primero debes eliminar (o deshabilitar) la restricción de Clave Foránea, truncar la tabla, y volver a crear la restricción.

Si esto te parece mucho trabajo, entonces tendrás que usar DELETE (que sí funciona, siempre que borres primero los hijos)