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: eliminar filas seleccionadas

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

DELETE FROM dbo.Tabla
WHERE Condicion;

La condición decide el alcance. Por eso debe comprobarse primero con un SELECT que utilice el mismo filtro.

TRUNCATE TABLE: vaciar la tabla completa

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.

TRUNCATE TABLE dbo.Tabla;

Su unidad de trabajo es la tabla completa. No permite elegir filas ni sustituye una eliminación filtrada.

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 explica en DECLARE, SET y SELECT.

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 agrupa cambios que podemos confirmar o revertir como una unidad. Esto 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 —una copia recuperable de los datos— 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, el código automático asociado a una eliminación. 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 Sí No
Registra la eliminación Por filas Mediante desasignación de páginas
Reinicia IDENTITY No normalmente Sí
Activa triggers DELETE Sí No
Puede tener restricciones por llaves foráneas Sí 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. Una llave foránea exige que una referencia apunte a una fila válida y puede impedir que eliminemos esa fila. 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 —varias eliminaciones pequeñas en lugar de una sola— puede reducir el crecimiento del log de transacciones, donde SQL Server registra los cambios, y la duración de los bloqueos. Aun así, necesita una condición estable y seguimiento del avance.

Relacionado con