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

Problema con claves foráneas

Estas en el tema de Problema con claves foráneas en el foro de Mysql en Foros del Web. Hola que tal, tengo un problema con una consulta que me da un error y no se porque. la consulta es la siguiente: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); ...
  #1 (permalink)  
Antiguo 08/08/2012, 12:17
 
Fecha de Ingreso: diciembre-2005
Ubicación: Mar del Plata
Mensajes: 146
Antigüedad: 18 años, 4 meses
Puntos: 2
Pregunta Problema con claves foráneas

Hola que tal, tengo un problema con una consulta que me da un error y no se porque.

la consulta es la siguiente:
Código MySQL:
Ver original
  1. INSERT INTO personas (nombre,apellido,ciudad,email,telefono,celular,usuario_id,tipopersona_id,estadocliente_id) values ('cd','','','','','','1','1','1')
o sin comillas simples (que tambien probe por las dudas):
Código MySQL:
Ver original
  1. INSERT INTO personas (nombre,apellido,ciudad,email,telefono,celular,usuario_id,tipopersona_id,estadocliente_id) values ('cd','','','','','',1,1,1)

me da el siguiente error:
#1452 - Cannot add or update a child row: a foreign key constraint fails (`avalith7_crm`.`personas`, CONSTRAINT `fk_personas_usuarios` FOREIGN KEY (`usuario_id`) REFERENCES `usuarios` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)

Esta es la estructura de las tablas:

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `tipopersona` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `nombre` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  4.   PRIMARY KEY (`id`)
  5. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
  6.  
  7. CREATE TABLE IF NOT EXISTS `estadocliente` (
  8.   `id` int(11) NOT NULL AUTO_INCREMENT,
  9.   `nombre` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  10.   PRIMARY KEY (`id`)
  11. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=12 ;
  12.  
  13. CREATE TABLE IF NOT EXISTS `usuarios` (
  14.   `id` int(11) NOT NULL AUTO_INCREMENT,
  15.   `alias` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  16.   `clave` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  17.   `nombre` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  18.   `rol` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  19.   PRIMARY KEY (`id`)
  20. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=4 ;
  21.  
  22. CREATE TABLE IF NOT EXISTS `personas` (
  23.   `id` int(11) NOT NULL AUTO_INCREMENT,
  24.   `nombre` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  25.   `apellido` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  26.   `ciudad` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  27.   `email` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  28.   `telefono` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  29.   `celular` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  30.   `usuario_id` int(11) DEFAULT NULL,
  31.   `tipopersona_id` int(11) DEFAULT NULL,
  32.   `estadocliente_id` int(11) DEFAULT NULL,
  33.   PRIMARY KEY (`id`),
  34.   KEY `fk_personas_usuarios` (`usuario_id`),
  35.   KEY `fk_personas_tipopersona1` (`tipopersona_id`),
  36.   KEY `fk_personas_estadocliente1` (`estadocliente_id`)
  37. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=21 ;
  38.  
  39. ALTER TABLE `personas`
  40.   ADD CONSTRAINT `fk_personas_usuarios` FOREIGN KEY (`usuario_id`) REFERENCES `usuarios` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  41.   ADD CONSTRAINT `fk_personas_tipopersona1` FOREIGN KEY (`tipopersona_id`) REFERENCES `tipopersona` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  42.   ADD CONSTRAINT `fk_personas_estadocliente1` FOREIGN KEY (`estadocliente_id`) REFERENCES `estadocliente` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;

por supuesto que en las tres primeras tablas tengo cargado con el id 1 algún dato:

Espero que alguien me pueda ayudar porque la verdad que ya me estuve volviendo loco.
Creo que el problema viene por el lado de las claves no se si están bien definidas o que (la base de datos la genere con el mysql workbench).

Desde ya muchisimas gracias a quien se tome el trabajo de leer todo esto y tirarme algun consejo.
__________________
Me gusta mucho ver Videos de carros en internet :)
  #2 (permalink)  
Antiguo 08/08/2012, 13:08
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: Problema con claves foráneas

¿Y qué devuelven estas consultas?:
Código MySQL:
Ver original
  1. SELECT * FROM usuarios WHERE id = 1;
  2. SELECT * FROM tipopersona WHERE id = 1;
  3. SELECT * FROM estadocliente WHERE id = 1;
__________________
¿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 08/08/2012, 14:25
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Problema con claves foráneas

Apuesto mi postre a que alguno de las consultas regresa vacía...

cpuser, el insert no tiene nada de malo por lo que tal como lo sospecha gnzsoloyo y también lo sospecho yo, alguna de las tablas no tiene registro con id = 1... de hecho por la descripción del error la tabla usuarios es la que debe estar vacía...

Chécalo y nos comentas.

Saludos
Leo.
  #4 (permalink)  
Antiguo 09/08/2012, 05:30
 
Fecha de Ingreso: diciembre-2005
Ubicación: Mar del Plata
Mensajes: 146
Antigüedad: 18 años, 4 meses
Puntos: 2
Respuesta: Problema con claves foráneas

si tengo datos eso es las mas raro, no había querido pegar todo para no hacer gigante el post les pongo el dumping

Código MySQL:
Ver original
  1. --
  2. -- Dumping data for table `usuarios`
  3. --
  4.  
  5. INSERT INTO `usuarios` (`id`, `alias`, `clave`, `nombre`, `rol`) VALUES
  6. (1, 'Nati', '1234567', 'Nati', 'admin'),
  7. (2, 'Agus', 'avalith1', 'Agus', 'Admin'),
  8. (3, 'juanfran', 'avalith1', 'juanfran', 'Admin');
  9.  
  10. --
  11. -- Dumping data for table `estadocliente`
  12. --
  13.  
  14. INSERT INTO `estadocliente` (`id`, `nombre`) VALUES
  15. (1, 'Proyectos Charlados'),
  16. (2, 'Proyectos Presupuestados'),
  17. (3, 'Proyectos Por Presupuestar'),
  18. (4, 'Proyectos Seniados Activos'),
  19. (5, 'Proyectos Seniados Congelados'),
  20. (6, 'Proyectos Activos'),
  21. (7, 'Proyectos Congelados'),
  22. (8, 'Proyectos Terminados'),
  23. (9, 'Proyectos Internos'),
  24. (10, 'Proyectos En Desarrollo'),
  25. (11, 'Proyectos Cancelados');
  26.  
  27. --
  28. -- Dumping data for table `tipopersona`
  29. --
  30.  
  31. INSERT INTO `tipopersona` (`id`, `nombre`) VALUES
  32. (1, 'Oportunidad'),
  33. (2, 'Cliente');

la verdad no se que puede ser...
__________________
Me gusta mucho ver Videos de carros en internet :)
  #5 (permalink)  
Antiguo 09/08/2012, 05:37
 
Fecha de Ingreso: diciembre-2005
Ubicación: Mar del Plata
Mensajes: 146
Antigüedad: 18 años, 4 meses
Puntos: 2
Respuesta: Problema con claves foráneas

lo mas raro es que acabo de crear en otra base una prueba con los codigos que les pegue y me anda bien...
__________________
Me gusta mucho ver Videos de carros en internet :)
  #6 (permalink)  
Antiguo 09/08/2012, 07:47
Avatar de jlct  
Fecha de Ingreso: abril-2012
Ubicación: Venezuela
Mensajes: 148
Antigüedad: 12 años
Puntos: 19
Respuesta: Problema con claves foráneas

Hice lo mismo que cpuser cree una BD para probar y me realizo el insert sin problemas.. intenta realizando este insert

INSERT INTO personas (nombre,apellido,ciudad,email,telefono,celular,usu ario_id,tipopersona_id,estadocliente_id) VALUES ('cd','','','','','',null,null,null)

ya que definiste los FK con default null si funciona (a mi me funcionó), reemplazas los null por el 1...

prueba y me avisas!
  #7 (permalink)  
Antiguo 10/08/2012, 06:03
 
Fecha de Ingreso: diciembre-2005
Ubicación: Mar del Plata
Mensajes: 146
Antigüedad: 18 años, 4 meses
Puntos: 2
Respuesta: Problema con claves foráneas

Para jlct : Probe con null y andaba pero con los valores 1 o '1' no funcionaba

La verdad que por fin lo pude arreglar pero nunca vamos a saber porque fallaba

Les cuento lo que hice y que me parece que fue..
La primera vez en mi cuenta de hosting cree la base de datos desde el panel y le puse mayúsculas por ejemplo : pepito_CRM
cree todas las tablas (por script) y luego pase el nombre de la base a minúsculas pepito_crm (ya ni me acuerdo porque lo hice) entonces empece a dar de alta datos en algunas tablas hasta que me tope con el problema con el que abri el tema.

Para arreglarlo borre la base de datos y cree otra en minúscula desde un principio y con otro nombre (por las dudas) y pegue el script (exactamente el mismo que la primera ves) solamente que esta ves no hubo ningún problema .....

Así que bueno lo unico que puedo concluir es que el cambio de nombre desde la sección avanzado del phpmyadmin no le gusto al cpanel o rompió algún permiso.

Asique bueno espero que mi experiencia sirva de ayuda para otros

Les agradezco mucho su ayuda y su tiempo.
__________________
Me gusta mucho ver Videos de carros en internet :)
  #8 (permalink)  
Antiguo 10/08/2012, 06:56
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: Problema con claves foráneas

Cita:
Así que bueno lo unico que puedo concluir es que el cambio de nombre desde la sección avanzado del phpmyadmin no le gusto al cpanel o rompió algún permiso.
No exactamente.
Posiblemente si hubieses explicado esos detalles del hosting desde el principio, hubiésemos tenido una idea más aproximada de lo que pudo pasar, o al menos de las cosas que había que revisar...
Me explico: En los servicios hosting que encuentras en la web es muy habitual que los servidores (de la base o del webserver) estén basados en Linux y no en Windows. Y eso hace una diferencia crítica.
Para Windows, poner "CONSTRAINT `fk_personas_usuarios`" o poner "CONSTRAINT `fk_Personas_usuarios`" es lo mismo, pero para Linux no.
Por empezar, una constraint de clase FK es un índice con ese nombre, que es lo que administra la relación entre ambas tablas, y como tal conforma un archivo. Como Linux puede diferenciar entre mayúsculas y minúsculas en los nombres de los archivos y otros objetos, ambos nombres se refieren a índices diferentes para él. Y como el manejo de archivos depende del sistema operativo y no a MySQL, se generan fácilmente conflictos casi indetectables por este asunto.
Como buena práctica de desarrollo de bases de datos se aconseja siempre que los nombres de todos los objetos de bases de datos estén siempre en minúsculas para evitar problemas de portabilidad, que parecen ser el corazón del asunto.

Habría que analizar el impacto que esos cambios tienen en los errores reportados.
Creo que es un tema para seguir verificando, ya a otro nivel.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: claves, 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 15:12.