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

Problemas con Foreign Key

Estas en el tema de Problemas con Foreign Key en el foro de Mysql en Foros del Web. Estoy haciendo una aplicación en la que tengo una base de datos con dos tablas llamadas usuario y roles , en las que un campo ...
  #1 (permalink)  
Antiguo 22/06/2011, 08:49
 
Fecha de Ingreso: abril-2008
Mensajes: 7
Antigüedad: 16 años, 8 meses
Puntos: 0
Problemas con Foreign Key

Estoy haciendo una aplicación en la que tengo una base de datos con dos tablas llamadas usuario y roles, en las que un campo de usuario es clave ajena/foranea de otro campo de roles, pero cuando hago un insert en roles me da el siguiente error:
Cannot add or update a child row: a foreign key constraint fails (`logofiles/roles`, CONSTRAINT `roles_ibfk_1` FOREIGN KEY (`clave`) REFERENCES `usuario` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE).

El esquema de la base de datos es el siguiente:


Código:
CREATE TABLE IF NOT EXISTS `roles` (
  `clave` int(11) NOT NULL auto_increment,
  `usuario` int(11) NOT NULL,
  `acceso` int(11) NOT NULL,
  PRIMARY KEY  (`clave`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;


CREATE TABLE IF NOT EXISTS `usuario` (
  `ID` int(11) NOT NULL auto_increment,
  `nombre` varchar(100) NOT NULL,
  `user` varchar(50) NOT NULL,
  `pass` varchar(50) NOT NULL,
  `correo` varchar(100) NOT NULL,
  PRIMARY KEY  (`ID`),
  UNIQUE KEY `usuario` (`user`,`correo`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;


ALTER TABLE `roles`
  ADD CONSTRAINT `roles_ibfk_1` FOREIGN KEY (`clave`) REFERENCES `usuario` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE;
El campo ID de la tabla usuario es la clave ajena/foranea y debe coincidir con el campo usuario de la tabla roles. La tabla roles la uso para definir el tipo de acceso que tenga cada usuario (administrador o usuario normal).

La inserción la hago primero en la tabla usuario y luego en la tabla roles, pero me da el error comentado, ¿alguien podría echarme una mano?
  #2 (permalink)  
Antiguo 22/06/2011, 09:03
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 11 meses
Puntos: 447
Respuesta: Problemas con Foreign Key

Hola toni_:

Creo que estás aplicando la llave foránea a la inversa. según entendí la tabla que tiene la llave foránea es la tabla usuario, es decir, un usuario debe tener un rol asignado, y un rol puede estar a signado a 0 o más usuarios.

Según yo, de la manera en que estás haciendo el constaint estás diciendo que un rol debe tener un usuario asignado.

creo que la restricción debería quedar así:

Código MySQL:
Ver original
  1. ALTER TABLE `usuario`
  2. ADD CONSTAINT `FK_usuario` FOREIGN KEY (`ID`) REFERENCES `roles` (`clave`)

Haz la prueba y nos comentas

Saludos
Leo.
  #3 (permalink)  
Antiguo 22/06/2011, 09:27
 
Fecha de Ingreso: abril-2008
Mensajes: 7
Antigüedad: 16 años, 8 meses
Puntos: 0
Respuesta: Problemas con Foreign Key

Gracias por tu ayuda. Estoy probando lo que me has dicho pero al ejecutar en phpmyadmin me muestra el siguiente error:
check the manual that corresponds to your MySQL server version for the right syntax to use near '`FK_usuario` FOREIGN KEY (`ID`) REFERENCES `roles` (`clave`) ON DELETE CASCADE ' at line 2.
He intentado arreglarlo pero no he podido, debe ser una tontería pero se me da tan mal mysql que no encuentro el fallo
  #4 (permalink)  
Antiguo 22/06/2011, 09:50
 
Fecha de Ingreso: abril-2008
Mensajes: 7
Antigüedad: 16 años, 8 meses
Puntos: 0
Respuesta: Problemas con Foreign Key

Creo que me daba error porque le faltaba la R a la instrucción CONSTRAINT. He probado y me dice que
Cannot add or update a child row: a foreign key constraint fails (`basededatos/usuario`, CONSTRAINT `FK_usuario` FOREIGN KEY (`ID`) REFERENCES `roles` (`clave`) ON DELETE CASCADE ON UPDATE CASCADE)


EDITO: Ya conseguí que funcione

Última edición por toni_; 27/06/2011 a las 08:42

Etiquetas: key, 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 21:21.