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

Multiples Foreign Keys a Multiples references

Estas en el tema de Multiples Foreign Keys a Multiples references en el foro de Mysql en Foros del Web. Hola, Estoy intentando hacer una tabla (orders) en la que hay dos campos "empresa" diferentes (sacados de una tabla "company" externa) y 4 contactos diferentes ...
  #1 (permalink)  
Antiguo 24/01/2010, 07:37
 
Fecha de Ingreso: febrero-2004
Mensajes: 4
Antigüedad: 20 años, 10 meses
Puntos: 0
Multiples Foreign Keys a Multiples references

Hola,

Estoy intentando hacer una tabla (orders) en la que hay dos campos "empresa" diferentes (sacados de una tabla "company" externa) y 4 contactos diferentes (cogidos de una tabla externa llamada "contacts")... que puedo estar haciendo mal con las references? (he usado MySQL Workbench para el diseño de las tablas)

Muchas gracias de antemano.

CREATE TABLE IF NOT EXISTS `db`.`orders` (
`id_order` INT(11) NOT NULL AUTO_INCREMENT ,
`id_company` INT(11) NOT NULL ,
`id_related_company` INT(11) NULL DEFAULT NULL ,
`id_contact_1` INT(11) NOT NULL ,
`id_contact_2` INT(11) NULL DEFAULT NULL ,
`id_contact_3` INT(11) NOT NULL ,
`id_contact_4` INT(11) NOT NULL ,
PRIMARY KEY (`id_order`) ,
CONSTRAINT `orders_ibfk_1`
FOREIGN KEY (`id_company` , `id_related_company` )
REFERENCES `db`.`companies` (`id_company` , `id_company` ),
CONSTRAINT `ordenes_ibfk_2`
FOREIGN KEY (`id_contact_1` , `id_contact_2` , `id_contact_3` , `id_contact_4` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARACTER SET = utf8;

CREATE INDEX `id_related_company` ON `db`.`orders` (`id_related_company` ASC) ;
CREATE INDEX `id_company` ON `db`.`orders` (`id_company` ASC) ;
CREATE INDEX `id_contact_1` ON `db`.`orders` (`id_contact_1` ASC) ;
CREATE INDEX `id_contact_2` ON `db`.`orders` (`id_contact_2` ASC) ;
CREATE INDEX `id_contact_3` ON `db`.`orders` (`id_contact_3` ASC) ;
CREATE INDEX `id_contact_4` ON `db`.`orders` (`id_contact_4` ASC) ;
  #2 (permalink)  
Antiguo 24/01/2010, 09:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Multiples Foreign Keys a Multiples references

No se entiende bien la estructura de relaciones, pero por lo que se ve, no estás definiendo correctamente el sentido de las FK.
Partamos de la base que una FK es un campo cuyo valor hace referencia a la PK de otra tabla.
Esto quiere decir que si la PK de la tabla referida está compuesta por un sólo campo, la FK será un sólo campo también; pero si la PK es compuesta por más de un campo, todos los campos de esa clave deben tener su correspondiente campo en la tabla donde figuran como FK.
Esto:
Código MySQL:
Ver original
  1. FOREIGN KEY (`id_company` , `id_related_company` )
  2. REFERENCES `db`.`companies` (`id_company` , `id_company` ),
no es válido si la tabla COMPANIES tiene una clave compuesta por un sólo campo.
Lo que debes tener en cuenta es que cada relación FK debe ser definida independientemente. En tu caso, si `id_company` e `id_related_company` son FK que apuntan a una clave simple, requieren dos declaraciones de FK independientes.
No existen en MySQL declaraciones de FK globales para varios campos al mismo tiempo.

¿Se comprende la idea?

Esto no es únco de MySQL. Es parte de la definición del modelo relacional.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 24/01/2010, 10:12
 
Fecha de Ingreso: febrero-2004
Mensajes: 4
Antigüedad: 20 años, 10 meses
Puntos: 0
Respuesta: Multiples Foreign Keys a Multiples references

Todo claro, muchisimas gracias :)

Etiquetas: keys, multiples, references, foreignkey
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 02:34.