
sobre la cascada de actualización en oracle
Database Administrators Stack Exchange es un sitio de preguntas y respuestas para los profesionales de las bases de datos que desean mejorar sus habilidades en este campo y aprender de otros miembros de la comunidad. Sólo se necesita un minuto para registrarse.
Tengo dos tablas en la base de datos MySQL – padre, hijo. Estoy tratando de añadir referencias de clave foránea a mi tabla hija basada en la tabla padre. ¿Hay alguna diferencia significativa entre ON UPDATE CASCADE y ON DELETE CASCADE?
1) ON DELETE CASCADE significa que si se elimina el registro padre, también se eliminan los registros hijos a los que hace referencia. ON UPDATE tiene como valor predeterminado RESTRICTO, lo que significa que la actualización del registro principal fallará.
Sobre el uso de los ID de los registros padre como claves externas (en las tablas hijo) — la experiencia dice que a) si los ID son números de secuencia autogenerados, entonces NO los use como claves externas. Utilice en su lugar alguna otra clave padre única. b) si los IDs son GUIDs, entonces está bien utilizarlos como claves foráneas. Verá lo acertado de esta sugerencia cuando exporte e importe los registros o los copie a otra base de datos. Es demasiado engorroso lidiar con los números de secuencia autogenerados durante la migración de datos cuando son referenciados como claves foráneas.
sobre la eliminación de sql
Voy a decir que raramente borro filas y punto. Por lo general, la mayoría de los datos que desea mantener. Simplemente se marcan como borrados para que no se muestren a los usuarios (es decir, para que aparezcan como borrados). Por supuesto, depende de los datos y para algunas cosas (por ejemplo, el contenido de la cesta de la compra) la eliminación de los registros cuando el usuario vacía su cesta está bien.
Sólo puedo suponer que el problema aquí es que usted puede eliminar involuntariamente los registros que en realidad no desea eliminar. Sin embargo, la integridad referencial debería evitarlo. Así que no puedo ver una razón en contra de esto que no sea el caso de ser explícito.
Los borrados en cascada no deberían causar una pérdida inesperada de datos. Si un borrado requiere que se borren los registros relacionados, y el usuario necesita saber que esos registros van a desaparecer, entonces no se debe utilizar el borrado en cascada. En su lugar, se debe pedir al usuario que elimine explícitamente los registros relacionados, o se le debe proporcionar una notificación.
Por otro lado, si la tabla se relaciona con otra tabla que es de naturaleza temporal, o que contiene registros que nunca se necesitarán una vez que la entidad madre haya desaparecido, entonces los borrados en cascada pueden ser correctos.
disparador mysql de borrado en cascada
Estoy revisando un proyecto del que me he hecho cargo, y en la parte de la base de datos me he dado cuenta de que los anteriores programadores han escrito un montón de triggers para borrar registros hijos. El problema es que estos registros ya tienen una relación de clave foránea con el registro padre que estoy borrando. Los triggers de borrado no son más que simples sentencias de borrado para los registros hijos.
El CASCADE DELETE en MSSQL Server sólo puede ser en cascada en una sola tabla. Si tiene dos tablas con relaciones de clave externa a una tabla de dimensión, sólo puede borrar en cascada a una de ellas. (Esto es para evitar que los borrados se realicen en cascada a través de múltiples rutas y creen conflictos, al igual que C++ permite la herencia múltiple pero C# sólo permite la herencia única)
Por esta razón he visto que mucha gente opta por usar triggers en todos los casos. Incluso cuando sólo hay una tabla extranjera. Esto asegura la consistencia y así la gente sabe lo que debe buscar al mantener la base de datos.
Si se pudiera hacer un borrado en cascada a más de una tabla diría que sería la opción más preferible. Esta limitación, sin embargo, enturbia las aguas y actualmente estoy más a favor de que los triggers sean los dueños de todos estos comportamientos. La sobrecarga en el uso de desencadenantes para las eliminaciones y actualizaciones en cascada es sólo menor en términos de codificación, pero permite las prácticas estándar que son verdaderamente genéricas.
disparador en cascada mysql
Estoy revisando un proyecto del que me he hecho cargo, y en la parte de la base de datos me he dado cuenta de que los anteriores programadores han escrito un montón de triggers para eliminar registros hijos. El problema es que estos registros ya tienen una relación de clave foránea con el registro padre que estoy borrando. Los triggers de borrado no son más que simples sentencias de borrado para los registros hijos.
El CASCADE DELETE en MSSQL Server sólo puede ser en cascada en una sola tabla. Si tiene dos tablas con relaciones de clave externa a una tabla de dimensión, sólo puede borrar en cascada a una de ellas. (Esto es para evitar que los borrados se realicen en cascada a través de múltiples rutas y creen conflictos, al igual que C++ permite la herencia múltiple pero C# sólo permite la herencia única)
Por esta razón he visto que mucha gente opta por usar triggers en todos los casos. Incluso cuando sólo hay una tabla extranjera. Esto asegura la consistencia y así la gente sabe lo que debe buscar al mantener la base de datos.
Si se pudiera hacer un borrado en cascada a más de una tabla diría que sería la opción más preferible. Esta limitación, sin embargo, enturbia las aguas y actualmente estoy más a favor de que los triggers sean los dueños de todos estos comportamientos. La sobrecarga en el uso de desencadenantes para las eliminaciones y actualizaciones en cascada es sólo menor en términos de codificación, pero permite las prácticas estándar que son verdaderamente genéricas.