DELETE y TRUNCATE: retirar datos con alcances diferentes

Eliminar información exige distinguir dos intenciones: borrar filas seleccionadas o vaciar una tabla completa. DELETE y TRUNCATE TABLE pueden dejar una tabla sin datos, pero no siguen las mismas reglas ni ofrecen el mismo control.

La idea

DELETE elimina las filas que cumplen una condición y puede utilizarse dentro de una transacción. Sin WHERE, intenta eliminar todas las filas.

TRUNCATE TABLE vacía toda la tabla. No acepta WHERE, utiliza un mecanismo diferente de liberación de páginas y reinicia el contador de una columna IDENTITY. También tiene restricciones cuando existen relaciones, replicación u otras características.

Sintaxis

DELETE FROM dbo.Tabla
WHERE Condicion;

TRUNCATE TABLE dbo.Tabla;

Ejemplo: identificar antes de eliminar

Queremos retirar movimientos antiguos de una tabla de trabajo. Primero contamos y revisamos una muestra:

DECLARE @FechaLimite DATETIME2(0) = '2026-01-01';

SELECT COUNT(*) AS FilasPorEliminar
FROM dbo.MovimientoInventario
WHERE FechaMovimiento < @FechaLimite;

SELECT TOP (20)
    IdMovimiento,
    IdProducto,
    FechaMovimiento,
    Referencia
FROM dbo.MovimientoInventario
WHERE FechaMovimiento < @FechaLimite
ORDER BY FechaMovimiento;

DECLARE define el límite como una variable local; su uso se desarrolla en la ficha sobre variables.

Después aplicamos la misma condición:

DELETE FROM dbo.MovimientoInventario
WHERE FechaMovimiento < @FechaLimite;

SELECT @@ROWCOUNT AS FilasEliminadas;

Probar una eliminación manual

Una transacción permite inspeccionar el resultado antes de decidir:

BEGIN TRANSACTION;

DELETE FROM dbo.MovimientoInventario
WHERE IdMovimiento = 1;

SELECT @@ROWCOUNT AS FilasEliminadas;

-- Sustituir por COMMIT únicamente después de validar.
ROLLBACK;

La transacción no reemplaza un respaldo ni una condición correcta. Solo mantiene abierta la posibilidad de revertir mientras siga activa.

Cuándo aparece TRUNCATE TABLE

Si una tabla temporal de carga debe quedar completamente vacía antes del siguiente proceso, podríamos utilizar:

TRUNCATE TABLE dbo.CargaTemporal;

No es una variante rápida de DELETE WHERE. Su alcance siempre es la tabla completa y no activa triggers DELETE. Aunque puede revertirse cuando se ejecuta dentro de una transacción en SQL Server, debemos tratarlo como una operación de alto impacto.

Diferencias principales

Aspecto DELETE TRUNCATE TABLE
Permite WHERE No
Registra la eliminación Por filas Mediante desasignación de páginas
Reinicia IDENTITY No normalmente
Activa triggers DELETE No
Puede tener restricciones por llaves foráneas Sí, con reglas más estrictas para TRUNCATE

Qué conviene comprobar

Antes de eliminar revisamos dependencias, llaves foráneas, triggers, retención requerida y la existencia de un respaldo utilizable. También debemos saber si otra sesión puede insertar o cambiar filas entre la validación y la eliminación.

Para volúmenes grandes, una eliminación por lotes puede reducir el crecimiento del log y la duración de bloqueos, pero necesita una condición estable y seguimiento del avance.

Relacionado con

  • WHERE: limita las filas eliminadas por DELETE.
  • Transacciones: permiten confirmar o revertir dentro de su alcance.
  • Llaves foráneas: pueden impedir la eliminación de filas referenciadas.
  • OUTPUT: puede capturar información de las filas eliminadas.