Hay una manera de cambiar el valor de una clave principal que se hace referencia a otra tabla como clave externa?

InformationsquelleAutor paweloque | 2011-02-15

7 Comentarios

  1. 6

    Una alternativa más fácil es insertar una nueva fila y eliminar el antiguo. (Actualización de cualquier referencia a las filas de otras tablas antes de hacer el delete)

  2. 4

    No hay una ACTUALIZACIÓN en CASCADA si eso es lo que está después. Tendría que hacer algo como deshabilitar cualquier FK limitaciones; ejecutar instrucciones de ACTUALIZACIÓN; volver a habilitar las restricciones.

    Tenga en cuenta que la actualización de las Claves principales es (casi siempre) una mala idea.

  3. 1

    Es posible incluso sin deshabilitar las restricciones, en caso de que si a usted le gusta sólo para intercambiar claves (que es también un cambio del subconjunto, por lo que podría ser la respuesta a su pregunta). Me escribió un ejemplo aquí: https://stackoverflow.com/a/26584576/1900739

    update MY_TABLE t1
    set t1.MY_KEY = (case t1.MY_KEY = 100 then 101 else 100 end)
    where t1.MYKEY in (100, 101)
    • Mientras que este vínculo puede responder a la pregunta, es mejor incluir a las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Enlace-sólo respuestas puede ser válido si la página enlazada cambios.
    • Gracias, he añadido el código de ejemplo.
  4. 0

    Sí, hay una manera de hacer la actualización en cascada en Oracle, incluso dentro de una transacción (lo cual no es cierto para la opción de habilitar/deshabilitar las restricciones). Sin embargo, usted tendrá que aplicar a ti mismo. Se puede hacer a través de antes/después de la fila-disparadores de actualización.

    Es posible debido al hecho de que los desencadenadores se ejecuta antes de cualquier restricciones se comprueban. (Bueno, al menos en Oracle 11.2 era cierto. No he chequeado contra 12.1, pero sinceramente creo que no ha cambiado.)

    De todos modos, como se dijo antes, la actualización de las claves principales es generalmente una mala idea.

  5. 0

    El principe es deshabilitar constrainsts, ejecutar su udates basado en la clave, y volver a habilitar el constrainst. Que por aquí hay un script que se ejecute la opción desactivar el script :
    (Asumiendo que todas las restricciones son de habilitar al inicio)

    Generar la secuencia de comandos

    SELECT 'alter table ' || uc.table_name|| ' disable constraint '|| uc.constraint_name|| ' ;'
    FROM user_constraints uc inner join user_cons_columns ucc on uc.constraint_name = ucc.constraint_name where column_name = 'MYCOLUMN_USED_AS_FOREIGN_KEY' and constraint_type='R'

    Copiar/pegar el script generado y ejecutar


    alter table MYTABLE1 disable constraint FK_MYTABLE1 ;
    alter table MYTABLE2 disable constraint MYTABLE2 ;
    alter table MYTABLE3 disable constraint FK3_MYTABLE3 ;
    ...

    A continuación, la actualización de sus valores de PK :

    update MYTABLE1 set MYFIELD= 'foo' where MYFIELD='bar';
    update MYTABLE2 set MYFIELD= 'foo' where MYFIELD='bar';
    update MYTABLE3 set MYFIELD= 'foo' where MYFIELD='bar';
    commit;

    Generar el habilitar las restricciones de secuencia de comandos :


    SELECT 'alter table ' || uc.table_name|| ' enable constraint '|| uc.constraint_name|| ' ;'
    FROM user_constraints uc inner join user_cons_columns ucc on uc.constraint_name = ucc.constraint_name where column_name = 'MYCOLUMN_USED_AS_FOREIGN_KEY' and constraint_type='R'

  6. 0

    Otra forma de hacer esto es mediante el cambio de las restricciones de clave externa, de manera que la validación de la restricción es diferido hasta que confirme – es decir, en lugar de Oracle la validación de las limitaciones de la instrucción por instrucción, voy a hacer la transacción por transacción.

    Nota que usted no puede hacer esto a través de la «alter table» declaración», pero se puede quitar y volver a crear la restricción de clave foránea ser prorrogables, yo.e:

    alter table <table name> drop constraint <FK constraint name>;
    alter table <table name> add constraint <FK constraint name> foreign key .... initially deferrable;

    Una vez que hayas hecho esto, basta con actualizar las tablas en el orden que te gusta, y se comprometen a – punto en el cual, ya sea:

    1. Todos sus FK restricciones son satisfechas, y todo el mundo feliz; o
    2. Ha violado una FK restricción en algún lugar, obtendrá un error y tendrá que corregir los datos y commit o rollback.

    Nota esta característica es bastante seguro, ya que Oracle no permite lecturas así que sólo vamos a ver los efectos de sus actualizaciones una vez de comprometerse. Por lo que desde la perspectiva de cada sesión, la integridad referencial parece ser preservado.

    También, esto es una vez apagado el cambio, así que usted no necesita ir la ejecución de DDL cada vez que quieres ir a la actualización de las claves principales.

Dejar respuesta

Please enter your comment!
Please enter your name here