Más de un Foreign Key entre dos tablas

Este sencillo post surgió por una pregunta que me hizo un buen amigo que no conocía muy bien esta característica de Oracle:¿Se puede tener más de una foreign key o llave foránea entre dos tablas? Aquí les muestro la respuesta con un ejemplo:

Muy bien, para iniciar requiero primero de tener una tabla que de momento llamaré TABLA_DESTINO, porque será el destino de las llaves foráneas o foreign keys:

SQL> create table tabla_destino ( 
  2    id     number(10)   constraint pk_td_id  primary key, 
  3    nombre varchar2(10) constraint nn_nombre not null, 
  4    clave  varchar2(5)  constraint nn_clave  not null 
  5                        constraint un_clave  unique 
  6  ) tablespace datos; 
 
Table created.

Después, voy a crear la segunda tabla que tendrá mi ejemplo de foreign keys apuntando a la tabla TABLA_DESTINO:

SQL> create table tabla_origen ( 
  2    id   number(10)  constraint pk_to_id primary key, 
  3    id01 varchar2(5), 
  4    id02 varchar2(5), 
  5    id03 varchar2(5), 
  6    constraint fk_id01 foreign key (id01) references tabla_destino (clave), 
  7    constraint fk_id02 foreign key (id02) references tabla_destino (clave), 
  8    constraint fk_id03 foreign key (id03) references tabla_destino (clave) 
  9  ) tablespace datos; 
 
Table created.

Como se puede observar, Oracle me permitió esto sin ningún problema. De tal forma que la respuesta a la pregunta inicial de mi amigo, es SI, efectivamente se puede tener más de una foreign key entre dos tablas.

Para confirmar que existen estos foreign keys, hay que consultar las vistas USER_CONSTRAINTS, ALL_CONSTRAINTS o DBA CONSTRAINTS como les muestro a continuación:

SQL> select table_name, constraint_name, constraint_type, r_owner, r_constraint_name 
  2  from   user_constraints 
  3  order by table_name, constraint_name; 
 
TABLE_NAME                     CONSTRAINT_NAME                C R_OWNER                        R_CONSTRAINT_NAME 
------------------------------ ------------------------------ - ------------------------------ ------------------------------ 
TABLA_DESTINO                  NN_CLAVE                       C 
TABLA_DESTINO                  NN_NOMBRE                      C 
TABLA_DESTINO                  PK_TD_ID                       P 
TABLA_DESTINO                  UN_CLAVE                       U 
TABLA_ORIGEN                   FK_ID01                        R PRUEBA                         UN_CLAVE 
TABLA_ORIGEN                   FK_ID02                        R PRUEBA                         UN_CLAVE 
TABLA_ORIGEN                   FK_ID03                        R PRUEBA                         UN_CLAVE 
TABLA_ORIGEN                   PK_TO_ID                       P 
 
8 rows selected.

Como se puede observar en negritas, se tienen ya creados las tres foreign keys entre las dos tablas. Con esto concluye este pequeño post.

Si la información de este post te ha sido de utilidad o quieres que agregue algo más, deja por favor un comentario, contestaré a la brevedad.

Anuncios

8 Responses to Más de un Foreign Key entre dos tablas

  1. nil says:

    chebree me sirvio

  2. Orlando Olguín Olvera says:

    Hola nil.

    Qué bueno que te fue de utilidad.

    Orlando.

  3. Hola quisiera saber si un campo puede funcionar como mas de un foreign key de otras tablas
    por ejemplo que la 1era tabla factura venta su pk es idfacturaventa y la 2da tabla
    factura compra su pk es idfacturacompra ahora tengo una 3era tabla cuyo pk es idfactura y este
    campo quiero que funcione como fk de la tabla factura venta y factura compra es decir
    que al campo idfactura de la 3era tabla lo amarro con la 1era y 2da tabla
    me pregunto si habra consecuencias en el campo idfactura si si sufre cambio tanto la tabla 1era y 2da
    de antemano gracias

  4. Orlando Olguín Olvera says:

    Hola Poolgiancarlos89.

    Nio debes tener problema para hacer eso, no te queda más que implementarlo.

    La única cosa que podría detenerte, sería el diseño mismo de la solución, si es lo que realmente esperas como parte de la lógica del negocio.

    Recuerda que sistemas se adapta al negocio, y no el negocio a sistemas.

    Orlando.

  5. miguel says:

    como hago para hacer la consulta y que me muestre los datos de las dos foraneas

  6. Orlando Olguín Olvera says:

    Hola Miguel.

    Tienes qué hacer un join del tipo:

    select t01.campo1,
    t01.campo2,
    t02.campo1,
    t03.campo2
    from tabla1 t01, <– Tabla fuente
    tabla2 t02, <– tabla de llave foránea 1
    tabla3 t03 <– tabla de llave foránea 2
    where t01.campo1 = t02.campo1
    and t01.campo1 = t03.campo1;

    Orlando.

  7. Amaau says:

    Alguien me podría explicar quien es (clave) y poque se pone pk_to_id no entiendo muy bien el código P:

  8. Orlando Olguín Olvera says:

    Hola Amauu.

    Voy a tomarlo al revés, de manera general, se pone el prefijo pk a un constraint de tipo primary key (P).

    Por ejemplo, para una tabla llamada FACTURA y cuyo identificador se llamará NO_FACT, yo le pondría PK_FACT_NO_FACT, para delimitar que es un primary key (PK), luego que pertenece a la tabla FACTURA (FACT) y fiinalmente que es del campo NO_FACT.

    Así, en lo que puse en mi post, tenemos PK_TD_ID, es el primary key de la TABLA_DESTINO (TD) y del campo ID.

    De similar forma, PK_TO_ID, es un primary key de la TABLA_ORIGEN (TO) y del campo ID.

    Así, tenemos dos primary keys que se ven en el listado de los contraints.

    Ahora, el objetivo del post es mostrar que desde una tabla se pueden crear tres foreign keys (llaves foráneas que hacen referencia de una tabla a otra a un valor); por eso, puse tres campos en la tabla origen (ID01, ID02 y ID03), que para realizar la prueba harán una referencia a un mismo campo en la TABLA_DESTINO por medio del campo CLAVE.

    Al poderse crear, demuestro que no es un problema este tipo de referencias. Espero no revolverte más.

    Orlando.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: