Uso "ON DELETE CASCADE" regularmente pero nunca uso "ON ACTUALIZAR CASCADE" ya que no estoy tan seguro de en qué situación será útil.
En aras de la discusión, veamos un código.
CREATE TABLE parent (
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id)
);
CREATE TABLE child (
id INT NOT NULL AUTO_INCREMENT, parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id)
REFERENCES parent(id)
ON DELETE CASCADE
);
Para "EN ELIMINAR CASCADA", si id
se elimina un padre con un, se eliminará parent_id = parent.id
automáticamente un registro en hijo con . Esto no debería ser un problema.
¿Esto significa que "EN ACTUALIZACIÓN EN CASCADA" hará lo mismo cuando
id
se actualice el padre?Si (1) es verdadero, significa que no hay necesidad de usar "EN ACTUALIZACIÓN EN CASCADA" si
parent.id
no es actualizable (o nunca se actualizará) como cuando estáAUTO_INCREMENT
o siempre está configuradoTIMESTAMP
. ¿Está bien?Si (2) no es cierto, ¿en qué otro tipo de situación deberíamos usar "EN ACTUALIZACIÓN EN CASCADA"?
¿Qué sucede si (por alguna razón) actualizo
child.parent_id
para que sea algo que no existe, entonces se eliminará automáticamente?
Bueno, lo sé, algunas de las preguntas anteriores se pueden probar mediante programación para comprender, pero también quiero saber si algo de esto depende del proveedor de la base de datos o no.
Por favor, arroja algo de luz.
Respuestas:
Es cierto que si su clave principal es solo un valor de identidad autoincrementado, no tendría un uso real para ON UPDATE CASCADE.
Sin embargo, supongamos que su clave principal es un código de barras UPC de 10 dígitos y, debido a la expansión, debe cambiarlo a un código de barras UPC de 13 dígitos. En ese caso, ON UPDATE CASCADE le permitiría cambiar el valor de la clave primaria y cualquier tabla que tenga referencias de clave externa al valor se cambiará en consecuencia.
En referencia al n. ° 4, si cambia la ID secundaria a algo que no existe en la tabla primaria (y tiene integridad referencial), debería obtener un error de clave externa.
fuente
ON UPDATE CASCADE
usarme para actualizar las claves primarias en una tabla antigua que no usa una clave de incremento automáticoSí, significa que, por ejemplo, si hace
UPDATE parent SET id = 20 WHERE id = 10
todos los hijos, los parent_id de 10 también se actualizarán a 20Si no actualiza el campo al que se refiere la clave externa, esta configuración no es necesaria
No se me ocurre ningún otro uso.
No puede hacerlo, ya que la restricción de clave externa fallará.
fuente
¡Creo que prácticamente has clavado los puntos!
Si sigue las mejores prácticas de diseño de bases de datos y su clave principal nunca es actualizable (lo cual creo que siempre debería ser el caso de todos modos), entonces realmente nunca necesita la
ON UPDATE CASCADE
cláusula.Zed hizo un buen punto, que si usa una clave natural (por ejemplo, un campo regular de su tabla de base de datos) como su clave principal, entonces puede haber ciertas situaciones en las que necesite actualizar sus claves primarias. Otro ejemplo reciente sería el ISBN (International Standard Book Numbers) que cambió de 10 a 13 dígitos + caracteres no hace mucho tiempo.
Este no es el caso si elige utilizar las claves sustitutas (por ejemplo, generadas artificialmente por el sistema) como su clave principal (que sería mi opción preferida en todas las ocasiones, excepto en las más raras).
Entonces, al final: si su clave principal nunca cambia, entonces nunca necesita la
ON UPDATE CASCADE
cláusula.Bagazo
fuente
colors
con filasblue
,purple
,yellow
, y una mesaproducts
con unaproduct_color
columna, siendo FK'ed a lacolors
mesa. Eso restringe las opciones como una enumeración, pero a diferencia de un entero de incremento automático, no requiere una combinación para obtener el nombre del color. En tal caso,on update cascade
es una buena idea, si decide quepurple
debería llamarse en suviolet
lugar.Hace unos días tuve un problema con los desencadenantes, y descubrí que
ON UPDATE CASCADE
puede ser útil. Eche un vistazo a este ejemplo (PostgreSQL):En mi problema, tuve que definir algunas operaciones adicionales (disparador) para actualizar la mesa del concierto. Esas operaciones tuvieron que modificar club_name y band_name. No pude hacerlo, por referencia. No pude modificar el concierto y luego lidiar con las mesas de clubes y bandas. No podría hacerlo de otra manera.
ON UPDATE CASCADE
fue la clave para resolver el problema.fuente
SERIAL
columnas enclub
yband
como claves principales si hace referencia aname
s en lugar de la clave principal de cada tabla?Mi comentario se refiere principalmente al punto n. ° 3: ¿en qué circunstancias es aplicable ON ACTUALIZAR CASCADA si suponemos que la clave principal no es actualizable? Aquí hay un caso.
Estoy lidiando con un escenario de replicación en el que varias bases de datos satelitales deben fusionarse con un maestro. Cada satélite está generando datos en las mismas tablas, por lo que la fusión de las tablas con el maestro conduce a violaciones de la restricción de unicidad. Estoy tratando de usar ON UPDATE CASCADE como parte de una solución en la que vuelvo a incrementar las claves durante cada fusión. ON UPDATE CASCADE debería simplificar este proceso al automatizar parte del proceso.
fuente
Es una excelente pregunta, ayer tuve la misma pregunta. Pensé en este problema, BÚSQUEDA específicamente si existía algo así como "EN ACTUALIZACIÓN EN CASCADA" y afortunadamente los diseñadores de SQL también habían pensado en eso. Estoy de acuerdo con Ted.strauss, y también comenté el caso de Noran.
¿Cuándo lo usé? Como señaló Ted, cuando está tratando varias bases de datos al mismo tiempo, y la modificación en una de ellas, en una tabla, tiene algún tipo de reproducción en lo que Ted llama "base de datos satelital", no se puede guardar con el original ID, y por cualquier motivo debe crear uno nuevo, en caso de que no pueda actualizar los datos del anterior (por ejemplo, debido a permisos, o en caso de que esté buscando solidez en un caso que es tan efímero que no merece el respeto absoluto y absoluto por las reglas totales de normalización, simplemente porque será una utilidad de muy corta duración)
Entonces, estoy de acuerdo en dos puntos:
(A.) Sí, en muchas ocasiones un mejor diseño puede evitarlo; PERO
(B.) En casos de migraciones, replicar bases de datos o resolver emergencias, es una GRAN HERRAMIENTA que afortunadamente estaba allí cuando fui a buscar si existía.
fuente