Gestionar la eliminación de datos en SQL requiere especial cuidado y decisiones estratégicas. Existen dos métodos principales para borrar registros de una base de datos: el borrado lógico (suave) y el borrado físico (duro). Entender claramente ambos y cuándo utilizarlos aporta valor añadido tanto operativo como legalmente a un proyecto.
¿Qué es el borrado lógico y cuándo utilizarlo?
El borrado lógico o suave es una técnica que no elimina el registro por completo de la base de datos, sino que lo marca como inactivo mediante la adición de una columna especial, comúnmente denominada active. Esto permite conservar los datos para:
Generar estadísticas.
Mantener auditorías.
Cumplir obligaciones legales.
¿Cómo implementar una columna de borrado lógico?
Se debe añadir una nueva columna active de tipo tiny int, que indicará mediante valores (1 activo, 0 inactivo) el estado del registro:
ALTERTABLE clients ADDCOLUMN active TINYINTNOTNULLDEFAULT1AFTER phone number;
Al marcar un registro como inactivo, actualizamos su valor a 0 mediante comando:
UPDATE clients SET active =0WHERE client_id =3680;
¿Cuál es el procedimiento para borrar físicamente datos en SQL?
El borrado duro implica eliminar definitivamente un registro de la base de datos, acción que no permite recuperar fácilmente la información eliminada. El comando SQL utilizado es:
DELETEFROM clients WHERE condicion;
¿Qué prácticas seguras seguir al realizar un borrado físico?
Para evitar pérdidas accidentales, es recomendable seguir buenas prácticas como:
Comenzar siempre escribiendo WHERE false antes de especificar condiciones.
Limitar la cantidad de filas eliminadas mediante LIMIT.
Usar condiciones específicas y seguras como el identificador único o valores exactos.
Ejemplo práctico de borrado:
DELETEFROM clients WHERE email ='user@example.com'LIMIT1;
¿Qué consideraciones tener con las claves foráneas (foreign keys) al eliminar datos?
Al usar borrado duro en tablas con relaciones (foreign keys), se debe atender especialmente la configuración de cascada (on delete cascade) que permite eliminar automáticamente registros relacionados. Esto, aunque útil, requiere gran precaución porque podría causar eliminaciones inesperadas en múltiples tablas.
¿Cuál es la importancia del acuerdo técnico sobre el método de borrado?
Incluir claramente en el desarrollo del sistema y en acuerdos con el equipo la forma en que se manejan los borrados (lógico o físico) es esencial. La decisión final depende del contexto operativo, legal y de negocio del proyecto.
TINYINT es un tipo de dato en SQL que se utiliza para almacenar números enteros pequeños. Ocupa 1 byte de espacio y puede contener valores desde -128 a 127 (si es con signo) o de 0 a 255 (si es sin signo). Es útil cuando necesitas una columna que almacene un número limitado de opciones, como un estado (activo/inactivo) o banderas booleanas, ayudando a optimizar el espacio en la base de datos.
la columna active es en extremo útil, la uso mucho para estudiar los datos históricos. pero a medida que pasa el tiempo, las tabla van aumentado de tamaño.
pregunta: cuales son las mejores prácticas para tener buen performance de una tabla con datos active = 0? borrarlos no es una opción aceptable.
Creo que una opción que se sale de la normalización es generar una tabla de archivo de las tuplas no activas, cada cierto tiempo mover los no activos de la tabla principal a la tabla histórico, de este modo sigues conservando la información pero ya no en la tabla principal para no afectar su performance. Así cada cierto tiempo de mantenimiento de la tabla principal mueves los no activos actuales a esa de histórico. Es mi sugerencia.
Muchas gracias por la sugerencia Oscar Barrón Martínez
La columna "active" en una base de datos es fundamental para implementar un borrado lógico. Esto significa que, al establecer el valor de "active" en 0 (cero), el registro se considera como eliminado sin borrarlo físicamente de la base de datos. Este enfoque permite conservar la información para auditorías, estadísticas y cumplimiento legal, asegurando que los datos no se pierdan completamente y puedan ser recuperados si es necesario.
En mi proyecto uso deleted=0 y si los usuarios borran un dato queda como 1, eso para todas las tablas. Es lo mismo pero al revés XD
¿Qué ventaja tendría usar TINYINT contra ENUM o BOOLEAN?
bro tinyint es un tipo de dato entero que permite numeros entre cero a 255 es decir solo lo usa porque almacena un numero de 0 o 1, sirve para almacenar cosas pequeñas
Para el ejemplo del profesor en una tabla similar a esta podrías manejar distintos estados para el cliente, en boolean solo tendrías 0 y 1 para activo o inactivo, pero que tal que quisieras agregar un estado 2 que podría ser "suspendido", porque quizá manejes clientes, que solo requieran activación (0), pero otros que estén suspendidos (2) y requieran algo más, simplemente y creo lo hizo por experiencia, uso el tinyint pensando en crecimiento del estatus active.
el boolean es un alias de tinyint!
Cuidado, porque aunque es muy usada esta idea no es necesariamente correcta. Un tinyint almacena 1 byte de información, es decir, puede guardar números desde el -128 al 127 o del 0 al 255 (si se usa unsigned). Mientras que esperaría que un boolean sólo bit (no byte) es decir, 0ó 1.
Efectivamente, el update y delete de sql es el rm -rf de linux :/
Para inactivar al cliente, agregué el campo identificacion:
mysql> update clientes set activo = 0 where identificacion = ########;
Borrado Lógico (Soft Delete)
Concepto: Marca un registro como "inactivo" sin eliminarlo físicamente.
Implementación: Añadir una columna active (tinyint, 0 o 1) a la tabla.
Ventaja: Preserva datos para auditoría, estadísticas o requisitos legales.
Ejecución: Se realiza mediante un UPDATE cambiando el valor de active a 0.
Borrado Físico (Hard Delete)
Concepto: Eliminación permanente del registro en la base de datos.
Comando:DELETE FROM [tabla] WHERE [condición].
Precaución: Es irreversible. Siempre debe incluir una cláusula WHERE para evitar borrar toda la tabla.
Buenas prácticas: Usar LIMIT para mayor control y probar primero con un SELECT para verificar qué registros serán afectados.
Es verdad, una ejecución mal y borré datos sin necesidad, :(
Hola a todos como dijo Andres Escobar cuando usamos el SQL worbench biene por defecto una activacion de proteccion de datos que no permoite borarr muchos datos a la vez que es normal en las empresas para protejerlos por si algun error humano se va y se borra mucha información.
La segunda tecnica para facilitar el borrado es la siguiente:
desactiva los permisos de seguridad y te deja borrar con el igualk a cero
SET SQL_SAFE_UPDATES = 0;
y despues de borrar vuelves a activar la seguridad por si acaso con el igual a 1
SET SQL_SAFE_UPDATES = 1;
Para quienes estén usando MySQL Workbench y les marca error al eliminar la data, deben seguir este proceso y reiniciar el MySQL Workbench
Desactivar el modo seguro en MySQL Workbench
Si usas MySQL Workbench:
Ve a Edit → Preferences
Abre SQL Editor
Desmarca Safe Updates
Guarda y reinicia Workbench
Saludos!!
El borrado lógico es un método de eliminación de datos en bases de datos donde, en lugar de eliminar un registro de forma permanente, se marca como "inactivo" o "eliminado" mediante una columna adicional, como "active". Esto permite que el registro siga existiendo en la base de datos, preservando información valiosa para auditorías o estadísticas. Por ejemplo, se puede establecer "active" a 0 para indicar que el registro está borrado, mientras que un valor de 1 indica que está activo. Esto es útil para cumplir con regulaciones legales sobre la retención de datos.
El borrado lógico es crucial para cualquier registro que haya generado una huella de negocio o legal. Nunca debes borrar físicamente una venta, una factura o el registro de un ex-empleado.
El borrado físico se reserva para datos temporales, errores puros o información de alto volumen que no tiene implicaciones legales ni estadísticas. Priorizar el borrado físico de los datos obsoletos (como carritos abandonados o logsviejos) es una práctica de mantenimiento de bases de datos que mejora la eficiencia.
WHERE: Filtra las filas de una tabla en una consulta SQL.
DELETE: Elimina registros de una tabla.
WHERE con DELETE: Permite eliminar registros específicos de una tabla, en lugar de todos ellos.
Maravilloso curso para repasar conceptos y conocer nuevos casos de uso.
En el caso de borrado suave, inclusive, en el caso de modificaciones, es buena idea tener columnas tipo "last_modified_date" y "last_modified_by" para indicar fecha-hora y autor del cambio.
Esto también se puede aplicar para los borrados suaves para temas de control y seguimiento.
Depende de qué tan elaborada o detallada se desea la tabla y la base de datos.
Active, es crear un historial de datos que ha tenido la tabla conexa con una Base de Datos, en lo que respecta borrado lógico.
En DELETE, es eliminar el registro de la Base de Datos.
Gran clase! Si la reglamentación del uso y protección de datos obliga a mantener la información durante un tiempo determinado, cuál sería el modelo que debemos usar cuando partimos de una Data Lake o estamos en un Data Warehouse? Es decir, si la BD estructurada original debe preservarse, podemos o debemos crear otra instancia de respaldo ? o siempre será una sola base de datos? que otras políticas podrían implementarse para no borrar la información en un proceso ETL bajo la gobernanza de datos en una empresa real.