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.