ProgramaciónIngeniero de bases de datos

Describa los procedimientos y características de la eliminación/limpieza segura (DELETE, TRUNCATE) de datos en SQL. ¿En qué se diferencian, cuáles son las limitaciones en transacciones, bloqueos y triggers, y cómo no perder datos accidentalmente?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

DELETE y TRUNCATE son ambas herramientas para limpiar tablas, pero funcionan de manera diferente:

  • DELETE elimina filas según una condición o todas, admite WHERE, se puede deshacer, activa triggers. Puede ser lento con un gran número de filas (una por una).
  • TRUNCATE limpia instantáneamente toda la tabla, no se puede usar WHERE, a menudo no se registra de manera fila por fila, no siempre activa triggers. En la mayoría de los casos, la acción no se puede deshacer, no se puede revertir en ciertas bases de datos.

Particularidades:

  • DELETE admite la reversión de la transacción (ROLLBACK), TRUNCATE no lo hace o depende de la base de datos.
  • TRUNCATE generalmente restablece el contador de identidad/secuencia.
  • TRUNCATE no es aplicable si hay claves externas o referencias a la tabla.

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;

Pregunta capciosa

¿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!

Ejemplos de errores reales debido a la falta de conocimiento sobre los matices del tema


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.