DELETE y TRUNCATE son ambas herramientas para limpiar tablas, pero funcionan de manera diferente:
Particularidades:
ROLLBACK), TRUNCATE no lo hace o depende de la base de datos.Ejemplo:
-- Eliminar pedidos de más de 3 años DELETE FROM orders WHERE created_at < CURRENT_DATE - INTERVAL '3 years'; -- Limpiar completamente la tabla (rápidamente) TRUNCATE TABLE logs;
¿Se pueden recuperar datos después de TRUNCATE?
Un error típico: pensar que, al igual que DELETE, TRUNCATE se puede revertir en una transacción. Pero TRUNCATE generalmente no se puede deshacer ni hacer UNDO, excepto en algunas bases de datos (por ejemplo, PostgreSQL al trabajar dentro de una transacción).
Ejemplo (en la mayoría de las bases de datos):
BEGIN; TRUNCATE TABLE orders; ROLLBACK; -- En la mayoría de las bases de datos no funcionará, ¡los datos se han perdido!
Historia
Eliminación de datos temporales en una base de datos de producción con TRUNCATE en lugar de TEST. El trigger de auditoría por eliminación de filas solo se activó en DELETE — la información sobre los datos perdidos, el tiempo y el usuario no estaba disponible. Se vio afectada la investigación del incidente.
Historia
Limpieza de una tabla con TRUNCATE en presencia de una clave externa. SQL lanzó un error debido a la restricción de integridad referencial, el script no se completó, la automatización se detuvo. Solución: quitar temporalmente las claves externas o usar DELETE.
Historia
Eliminación masiva de datos a través de DELETE en tablas grandes sin batching: debido a bloqueos prolongados, la base se "congeló", otras transacciones esperaban la liberación de bloqueos. Resultado — inactividad del sistema. Correcto: usar DELETE LIMIT/OFFSET, si se admite, o batches.