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

Problema con tablas intermedias

Estas en el tema de Problema con tablas intermedias en el foro de Bases de Datos General en Foros del Web. Hola este es mi 1º posteo, ojala me puedan ayudar Estoy haciendo una DB en la cual tengo una RELACION MUCHOS A MUCHOS, para eso ...
  #1 (permalink)  
Antiguo 14/02/2012, 15:26
 
Fecha de Ingreso: febrero-2012
Mensajes: 8
Antigüedad: 12 años, 2 meses
Puntos: 0
Pregunta Problema con tablas intermedias

Hola este es mi 1º posteo, ojala me puedan ayudar

Estoy haciendo una DB en la cual tengo una RELACION MUCHOS A MUCHOS, para eso cree una tabla intermedia,

Tabla1: "Aplicaciones"
Campos: ID_APP - Nombre

Tabla2: "Package"
Campo: ID_PKG - Nombre

Tabla intermedia: Table_app_pkg
Campos: ID_APP - ID_PKG

Tabla 3: Project
Campos: Entre otros: ID_APP - ID_PKG

Hice las relaciones entre todas la tablas, siendo las ID de tabla 1 , 2 e intermedia primarias

En la tabla 3 son Foreign (Las relacione, nose si sera igual) de la tabla intermedia.

Las tablas 1 y 2 tienen datos

AHORA EL PROBLEMA:
Al momento de llenar la tabla 3, lleno todos los campos y al pasar a la siguiente fila me dice que requiere de datos de la tabla intermedia y no me deja continuar.
Se supone q esta tabla intermedia actua como "puente" entre las tablas. Al momento de ingresarle los datos deberia de buscarla automaticamente en las tablas 1 y 2 y hacer la comprobacion de si existen pero no lo hace y me las pide como si tubiera que rellenar la tabla intermedia.

Estoy haciendo algo mal? Cree mal la tabla intermedia? Las Foreign estan malas?
Que esta mal???

Intentare subir mas rato un video o fotos para que se vea mejor el problema.

Gracias y ojala alguien me responda.
  #2 (permalink)  
Antiguo 15/02/2012, 10:03
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 tablas intermedias

Hola Lorgenome:

Lo que está pasando en realidad no es un error, sino un mal planteamiento de cómo estás haciendo tus relaciones. Al estar relacionando la tabla intermedia con tu tabla3, estás obligando a que sólo las parejas que existan en la tabla intermedia se puedan asignar a la tabla3... veamos si queda claro con un ejemplo (no mencionas qué manejador de BD estás utilizando, pongo el ejemplo en MySQL pero debería aplicar a cualquier BD):

Código MySQL:
Ver original
  1. mysql> SELECT * FROM aplicaciones;
  2. +--------+----------------+
  3. | ID_APP | Nombre         |
  4. +--------+----------------+
  5. |      1 | Aplicacion uno |
  6. |      2 | Aplicacion dos |
  7. +--------+----------------+
  8. 2 rows in set (0.00 sec)
  9.  
  10. mysql> SELECT * FROM package;
  11. +--------+-------------+
  12. | ID_PKG | Nombre      |
  13. +--------+-------------+
  14. |      1 | Package uno |
  15. |      2 | Package dos |
  16. +--------+-------------+
  17. 2 rows in set (0.02 sec)
  18.  
  19. mysql> SELECT * FROM table_app_pkg;
  20. +--------+--------+
  21. | id_app | id_pkg |
  22. +--------+--------+
  23. |      1 |      1 |
  24. |      2 |      2 |
  25. +--------+--------+
  26. 2 rows in set (0.00 sec)
  27.  
  28. mysql> #insertamos dos registros con una pareja de valores que exista en la
  29. mysql> #tabla intermedia
  30. mysql> INSERT INTO project VALUES
  31.     -> (1, 1, 'Otro campo 1, 1'),
  32.     -> (2, 2, 'Otro campo 2, 2');
  33. Query OK, 2 rows affected (0.09 sec)
  34. Records: 2  Duplicates: 0  Warnings: 0
  35.  
  36. mysql> SELECT * FROM project;
  37. +--------+--------+-----------------+
  38. | id_app | id_pkg | otro_campo      |
  39. +--------+--------+-----------------+
  40. |      1 |      1 | Otro campo 1, 1 |
  41. |      2 |      2 | Otro campo 2, 2 |
  42. +--------+--------+-----------------+
  43. 2 rows in set (0.00 sec)
  44.  
  45. mysql> #intentamos insertar un registro donde los valores
  46. mysql> #existen en las tablas 1 y 2, pero no existen
  47. mysql> #en la tabla intermedia
  48. mysql> INSERT INTO project VALUES (1, 2, 'Otro campo 1, 2');
  49. ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint
  50. fails (`pruebas`.`project`, CONSTRAINT `FK_project` FOREIGN KEY (`id_app`,
  51. `id_pkg`) REFERENCES `table_app_pkg` (`id_app`, `id_pkg`))
  52. mysql>

Observa que en la tabla intermedia existen las parejas (1, 1) y (2, 2), pero en el ultimo de los casos se está intentando insertar una pareja (1, 2). Aunque estos dos valores EXISTEN EN LAS TABLAS 1 Y 2, NO EXISTEN EN LA TABLA INTERMEDIA, por lo tanto se está respetando la integridad de la información... pues la relación está dada sobre la tabla intermedia, no sobre las tablas 1 y 2.

Ahora bien, te repito que esto no está bien o mal, depende de lo que en realidad quieras hacer. Si fuera el caso de que en tu tabla projects puedas poner parejas de valores QUE NO EXISTAN EN LA TABLA INTERMEDIA, pero que existan en las tablas 1 y 2, entonces las relaciones las tienes que hacer justamente sobre las tablas 1 y 2...

Sería conveniente que pusieras también la sentencia de creación de tus tablas, para revisar cómo estás definiendo las relaciones. Para el ejemplo que puse así quedaron definidas las tablas:


Código MySQL:
Ver original
  1. CREATE TABLE `aplicaciones` (
  2.   `Nombre` varchar(20) NOT NULL,
  3.   PRIMARY KEY (`ID_APP`)
  4.  
  5. CREATE TABLE `package` (
  6.   `Nombre` varchar(20) NOT NULL,
  7.   PRIMARY KEY (`ID_PKG`)
  8.  
  9. CREATE TABLE `table_app_pkg` (
  10.   `id_app` int(11) unsigned NOT NULL,
  11.   `id_pkg` int(11) unsigned NOT NULL,
  12.   PRIMARY KEY (`id_app`,`id_pkg`),
  13.   KEY `FK_table_app_pkg2` (`id_pkg`),
  14.   CONSTRAINT `FK_table_app_pkg1` FOREIGN KEY (`id_app`)
  15. REFERENCES `aplicaciones` (`ID_APP`),
  16.   CONSTRAINT `FK_table_app_pkg2` FOREIGN KEY (`id_pkg`)
  17. REFERENCES `package` (`ID_PKG`)
  18.  
  19. CREATE TABLE `project` (
  20.   `id_app` int(11) unsigned NOT NULL,
  21.   `id_pkg` int(11) unsigned NOT NULL,
  22.   `otro_campo` varchar(20) NOT NULL,
  23.   KEY `FK_project` (`id_app`,`id_pkg`),
  24.   CONSTRAINT `FK_project` FOREIGN KEY (`id_app`, `id_pkg`)
  25. REFERENCES `table_app_pkg` (`id_app`, `id_pkg`)

Etiquetas: access, 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 08:45.