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

foreign key constraint NO ENTIENDO NADA

Estas en el tema de foreign key constraint NO ENTIENDO NADA en el foro de Mysql en Foros del Web. hola miren tengo esto..... lo de abajo y no puedo agregar esto.. que error hay, a la tabla pais, no le puedo agregar, INSERT INTO ...
  #1 (permalink)  
Antiguo 15/06/2013, 19:03
 
Fecha de Ingreso: febrero-2013
Ubicación: en mi casa
Mensajes: 541
Antigüedad: 11 años, 8 meses
Puntos: 3
foreign key constraint NO ENTIENDO NADA

hola miren tengo esto..... lo de abajo y no puedo agregar esto..


que error hay, a la tabla pais, no le puedo agregar,
INSERT INTO `pais` (`id_pais`, `id_region`, `descripcion`) VALUES
(NULL, 1, 'Rusia');


ME APARECE ESTO


#1062 - Duplicate entry '1' for key 'id_region'


tengo 3 tablas,
region (id,descripcion) id es PK

pais(idpais, idregion,descripcion) idpais es PK, idregion es foranea referenciando a la PK de region

distrito(iddistrito,idpais,descripcion) iddistrito es pk, idpais es foranea referenciando a pk de pais


Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `distrito` (
  2.   `id_distrito` int(11) NOT NULL AUTO_INCREMENT,
  3.   `id_pais` int(11) NOT NULL,
  4.   `descripcion` varchar(60) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  5.   PRIMARY KEY (`id_distrito`),
  6.   UNIQUE KEY `id_pais` (`id_pais`)
  7.  
  8. --
  9. -- Volcar la base de datos para la tabla `distrito`
  10. --
  11.  
  12.  
  13. -- --------------------------------------------------------
  14.  
  15. --
  16. -- Estructura de tabla para la tabla `pais`
  17. --
  18.  
  19. CREATE TABLE IF NOT EXISTS `pais` (
  20.   `id_pais` int(11) NOT NULL AUTO_INCREMENT,
  21.   `id_region` int(11) NOT NULL,
  22.   `descripcion` varchar(60) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  23.   PRIMARY KEY (`id_pais`),
  24.   UNIQUE KEY `id_region` (`id_region`)
  25.  
  26. --
  27. -- Volcar la base de datos para la tabla `pais`
  28. --
  29.  
  30. INSERT INTO `pais` (`id_pais`, `id_region`, `descripcion`) VALUES
  31. (1, 1, 'China');
  32.  
  33. -- --------------------------------------------------------
  34.  
  35. --
  36. -- Estructura de tabla para la tabla `region`
  37. --
  38.  
  39. CREATE TABLE IF NOT EXISTS `region` (
  40.   `id_region` int(11) NOT NULL AUTO_INCREMENT,
  41.   `descripcion` varchar(60) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  42.   PRIMARY KEY (`id_region`)
  43.  
  44. --
  45. -- Volcar la base de datos para la tabla `region`
  46. --
  47.  
  48. INSERT INTO `region` (`id_region`, `descripcion`) VALUES
  49. (1, 'Asia'),
  50. (2, 'America'),
  51. (3, 'Europa'),
  52. (4, 'Africa'),
  53. (5, 'Oceania');
  54.  
  55. --
  56. -- Filtros para las tablas descargadas (dump)
  57. --
  58.  
  59. --
  60. -- Filtros para la tabla `distrito`
  61. --
  62. ALTER TABLE `distrito`
  63.   ADD CONSTRAINT `distrito_ibfk_1` FOREIGN KEY (`id_pais`) REFERENCES `pais` (`id_pais`) ON DELETE CASCADE ON UPDATE CASCADE;
  64.  
  65. --
  66. -- Filtros para la tabla `pais`
  67. --
  68. ALTER TABLE `pais`
  69.   ADD CONSTRAINT `pais_ibfk_1` FOREIGN KEY (`id_region`) REFERENCES `region` (`id_region`) ON DELETE CASCADE ON UPDATE CASCADE;

Última edición por gnzsoloyo; 15/06/2013 a las 19:11
  #2 (permalink)  
Antiguo 15/06/2013, 19:15
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: foreign key constraint NO ENTIENDO NADA

Declaraste como UNIQUE el campo de region_id en a tabla país, por lo que no puedes usar el mismo valor para dos países distintos.
Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `pais` (
  2.   `id_pais` INT(11) NOT NULL AUTO_INCREMENT,
  3.   `id_region` INT(11) NOT NULL,
  4.   `descripcion` VARCHAR(60) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  5.   PRIMARY KEY (`id_pais`),
  6.   UNIQUE KEY `id_region` (`id_region`)

Para China:
Código MySQL:
Ver original
  1. INSERT INTO `pais` (`id_pais`, `id_region`, `descripcion`) VALUES
  2. (1, 1, 'China');

Y para Rusia:
Código MySQL:
Ver original
  1. INSERT INTO `pais` (`id_pais`, `id_region`, `descripcion`) VALUES
  2. (NULL, 1, 'Rusia');
Es un problema de diseño. Esencialmente estás creando dos tipos de clave diferente para la misma tabla: La PK y una clave alternativa. Una de las dos está de más.

Si el país pertenece a una región, entonces region_id, no debe ser UNIQUE sino FK de otra tabla, cosa completamente diferente.
__________________
¿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 15/06/2013, 19:22
 
Fecha de Ingreso: febrero-2013
Ubicación: en mi casa
Mensajes: 541
Antigüedad: 11 años, 8 meses
Puntos: 3
Respuesta: foreign key constraint NO ENTIENDO NADA

me mareo cuando declaro foreign key,
segui los pasos de aca, para relacionar pk con fk y etc, creo que esta mal eso de unique, como lo tendria que hacer, saltear ese paso??

http://blog.rogertm.com/tutoriales/c...yadmin/77.html
  #4 (permalink)  
Antiguo 15/06/2013, 19:27
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: foreign key constraint NO ENTIENDO NADA

No hay mucho por donde marearse: Si ese campo es para indicar que un país pertenece a una región, se declara en esa tabla ese campo como FK de la tabla "Regiones". Lo de UNIQUE es otra cosa totalmente diferente.
Un campo UNIQUE es un campo tal que en su tabla sólo puede tener valores únicos considerando todos los registros entrantes de la tabla.
En los hechos, un campo UNIQUE es una clave alternativa desde el momento en que una clave primaria debe ser UNIQUE como condición esencial.

¿Se entiende?

Por otro lado, lo siento, pero no miro tutoriales, por lo que no te voy a dar mi opinión sobre él. Prefiero un buen manual, cuando lo necesito, o un libro técnico avanzado.
Los tutoriales no son algo que me entusiasme. Por lo general no están bien escritos y me cansé de encontrar modelos erróneos en ellos.
Si a tí te sirve, bien.
__________________
¿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: constraint, insert, key, nada, tabla
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 16:07.