Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Claves foraneas

Estas en el tema de Claves foraneas en el foro de Mysql en Foros del Web. Buenas, Tengo una base de datos con varias tablas. Una de ellas es usuarios, en la que su PK es email. Otra tabla es amigos, ...
  #1 (permalink)  
Antiguo 22/05/2012, 04:22
 
Fecha de Ingreso: abril-2012
Mensajes: 6
Antigüedad: 12 años
Puntos: 0
Claves foraneas

Buenas,
Tengo una base de datos con varias tablas. Una de ellas es usuarios, en la que su PK es email. Otra tabla es amigos, que tiene solo dos campos, email1 y email2, PK(email1,email2). La cuestion es que quiero que para la tabla amigos la clave foranea para email1 sea email de usuarios y para email2 tambien sea email de usuarios. Estoy utilizando el motor InnoDB y el codigo que intengo ejecutar es el siguiente pero me da error:

CREATE TABLE if not exists `personas`.`amigos` (`email1` VARCHAR(30) NOT NULL ,`email2` VARCHAR(30) NOT NULL , PRIMARY KEY (`email1`, `email2`) , INDEX (`email1`, `email2`) , FOREIGN KEY (`email1` , `email2` ) REFERENCES `personas`.`usuarios` (`email`,`email`) ON DELETE CASCADE ON UPDATE NO ACTION) ENGINE=INNODB;

El error que me da es errno: 150.

Alguien me puede ayudar en como conseguir esto?
Muchas gracias
  #2 (permalink)  
Antiguo 22/05/2012, 04:55
 
Fecha de Ingreso: mayo-2012
Mensajes: 42
Antigüedad: 11 años, 11 meses
Puntos: 5
Respuesta: Claves foraneas

Hola igagop,

Acabo de comprobar:

Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS table1 (
  2.   email VARCHAR(50) NOT NULL,
  3.   nombre VARCHAR(45) NULL DEFAULT NULL,
  4.   PRIMARY KEY (email)
  5.   );
  6.  
  7. CREATE TABLE IF NOT EXISTS table2 (
  8.   email VARCHAR(50) NOT NULL,
  9.   email2 VARCHAR(50) NOT NULL,
  10.   INDEX fk_table2_table1 (email ASC),
  11.   INDEX fk_table2_table11 (email2 ASC),
  12.   PRIMARY KEY (email, email2),
  13.   CONSTRAINT fk_table2_table1
  14.     FOREIGN KEY (email)
  15.     REFERENCES table1 (email),
  16.   CONSTRAINT fk_table2_table11
  17.     FOREIGN KEY (email2)
  18.     REFERENCES table1 (email)
  19.     );

Y funciona. Nose si es exactamente eso lo que querías. Pero de ser así debes de tener algo mas, no relacionado con las fk.

¡Un saludo!
  #3 (permalink)  
Antiguo 22/05/2012, 06:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Claves foraneas

Tienes que fijarte en algunas cosas: Los tipos de dato de las FK tienen que ser exactamente iguales que las PK las tablas referenciadas, y las tablas maestras se deben crear primero.
Pero por lo que observo, tienes un error en la definición de las FK:
Cada FK se debe definir separadamente, es decir:
Código MySQL:
Ver original
  1. CREATE TABLE if not exists `personas`.`amigos` (
  2.     `email1` VARCHAR(30) NOT NULL ,
  3.     `email2` VARCHAR(30) NOT NULL ,
  4.     PRIMARY KEY (`email1`, `email2`) ,
  5.     FOREIGN KEY (`email1`) REFERENCES `personas`.`usuarios` (`email`) ,
  6.     FOREIGN KEY (`email2`) REFERENCES `personas`.`usuarios` (`email`)
  7.     ) ENGINE=INNODB;
No puedes definir una FK grupal, a menos que la PK de origen sea multcampo, y no es e caso.
Cada FK, por más que apunte a la misa tabla, se define por separado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 23/05/2012 a las 07:30
  #4 (permalink)  
Antiguo 23/05/2012, 07:09
 
Fecha de Ingreso: mayo-2012
Mensajes: 42
Antigüedad: 11 años, 11 meses
Puntos: 5
Respuesta: Claves foraneas

Hola gnzsoloyo,

He revisado tu código y veo que has omitido los índices. Ya me ha tocado ver unas cuantas veces mas esto, y la cuestión esque no entiendo muy bien el por qué.

Nose si tampoco tengo muy claro la utilidad de los mismos ¿no? Pero, ¿podrías explicarme brevemente por qué se quitan y en qué altera eso a la integridad referencial, si lo hace?

Nota: No creo necesario abrir un nuevo post para esto, pero si así se considera, lo hago sin problema.

¡Un saludo!

Etiquetas: claves, tabla, foreignkey, campos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:21.