"On update" en enterprise manager

Quiero crear las siguientes tablas pero me da un error.
Create table parent (
Id number(11) primary key
);
//Que se crea bien
create table child (
id number(11),
ref_id number(11)
references parent
on delete cascade
on update cascade
);
//Me da un error
No me deja hacer el "on update cascade", si lo hago solo con el "on delete cascade" funciona, pero no con el update.
Hay alguna otra forma de hacerlo.

1 respuesta

Respuesta
1
No es posible indicar la clausula ON UPDATE CASCADE, ya que eso sería como validar que la cleve primaria pueda cambiar y eso causaría un problema de integridad, en el caso de interrumpirse, por ello no se permite y carece de lógica intentar hacerlo.
Debes crear tu table hija sólo con la clausula ON DELETE CASCADE, la otra no está permitida.
Las claves primerias no se deben modificar ya que generan inconsistencia referencial, lo más sano en estos casos es Borrar la clave primaria (Para lo cual está el DELETE CASCADE), y luego insertar otra que en este caso sea la correcta. REcuerda que este tipo de operaciones es costosa a nivel de BD, no olvides que una cleve primaria es a su vez un índice. Además no tiene sentido estar cambiando una clave primaria ya que se supone que éste es un registro único.
Entonces no hay ninguna forma de que si se modifica la clave principal de una tabla padre, esta se actualice automáticamente en las foreign key de las tablas hijas.
Saludos,
El problema que tengo es que estoy manteniendo la intranet de mi facultad, y resulta que tengo una tabla tema que tiene como clave principal el código de la asignatura y el numero del tema (1,2,...), y luego tengo otra tabla subtema que tiene como clave principal el código de la asignatura, el numero del tema y el número del subtema. Como te habrás imaginado, existe una forign key entre las dos tablas.
Pues resulta que este año, algunos temas han cambiado su número, entonces lo que quiero es que al actualizarse ese numero del tema en la tabla temas, también se actualice en todos los subtemas de ese tema con el nuevo numero.
¿Sabes si se puede hacer utilizando un trigger? ¿Cómo se haría ese trigger?
Gracias, (lo siento, se que estoy siendo un poco pesado)
Amigo definitivamente no se puede hacer del modo como tu lo deseas, eso es un comportamiento LÓGICO standard de la BD. Sin embargo yo te recomiendo que lo hagas de la siguiente te manera:
alter table <TABLA> DISABLE CONSTRAINT <CONS_NAME> CASCADE;
Esto se hace para deshabilitar el constraint mientras realizar los cambios, luego ejecutas lo siguiente:
alter table <TABLA> ENABLE VALIDATE CONSTRAINT <CONS_NAME>;
Para recuperar la validación del constrint, OJO lla modificación de la tabla padre y la hija debes hacerla bien ya que cuando actives el constraint te pueden dar errores inesperados.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas