SQL - Claves foráneas

 
Vista:

Claves foráneas

Publicado por tamara (2 intervenciones) el 05/08/2010 13:09:07
Buenos días!
tengo un problema...

He creado una tabla:

create table cpn_rec_internacio(
cod_desc char(10) not null upshift label "Código",
idioma char(2) not null upshift label "Idioma",
contenido char(30) upshift label "Descripción");

alter table cpn_rec_internacio
primary key(cod_desc,idioma);

Y ahora tengo que crear otra:

create table tipo_peticion(
cod_tippet smallint not null label "Código",
des_tippet char(30) upshift label "Descripción",
estudio char(1) upshift check ($ in ('S','N')) default "N" label "Estudio",
activo char(1) upshift check ($ in (0,1)) default 0 label "Activo",
cod_desc char(10) upshift label "Etiqueta con descripción");

alter table tipo_peticion
primary key (cod_tippet);

alter table tipo_peticion
foreign key f_tipopet_1(cod_desc) references cpn_rec_internacio(cod_desc)
on update restrict
on delete restrict;

-------------------------------------------------

El problema es que no me funciona lo de foreign key porque cpn_rec_internacio tiene COD_DESC pero tipo_peticion tiene como primarias COD_DESC,IDIOMA.

Al ejecutarlo me dice: "Faltan componentes de la clave en la lista de columnas"

Imagino que en la parte de tipo_peticion debería tener dos columnas y no una, y en la parte de cpn_rec_internacio, poner las dos columnas que conforman la clave primaria.

¿Alguien me puede ayudar, por favor?

Gracias. Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

RE:Claves foráneas

Publicado por Leonardo Josue (1173 intervenciones) el 05/08/2010 16:34:53
Buenos días Tamara, efectivamente, el problema como comentas es debido que la tabla cpn_rec_internacio tiene una llave compuesta por dos campos (cod_desc, idioma) mientras que la tabla tipo_peticion solo contiene uno de los dos campos (cod_desc). te pongo un ejemplo de por qué habría problemas.

Supongamos que en tu tabla cpn_rec tienes los siguientes datos:

cod_desc|idioma
123|Español (España)
123|Español (Latinoamerica)
456|Inglés (E.U.A)
456|Inglés (Inglaterra)

Esto es perfectamente válido, pues tu llave es cumpuesta. sin embargo, si en tu tabla tipo_peticion tienes esto algún registro con el código 123 o 456 no podrías determinar contra qué registro se tiene que relacionar, ya que para el ejemplo existen dos posibilidades para cada código.

Aquí tienes dos opciones para solucionar el problema:

1. Agregar el campo idioma a la tabla tipo_peticion, entonces sí podrías enlazar ambas tablas.

2. En tu tabla cpn_rec_internacio generar un campo identidad que sea tu llave única, y ese campo incluirlo también en la tabla tipo_petición. sería algo como esto.

id|cod_desc|idioma
1|123|Español (España)
2|123|Español (Latinoamerica)
3|456|Inglés (E.U.A)
4|456|Inglés (Inglaterra)

Saludos.
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Claves foráneas

Publicado por tama (2 intervenciones) el 06/08/2010 09:12:52
Muchas gracias Leo por tu pronta respuesta. Yo había pensado en la primera de las soluciones :) lo consultaré con mi jefe cuando vuelva de vacaciones a ver que le parece. Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar