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 |
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. 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 porDELETE.- 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.