Ver Mensaje Individual
  #2 (permalink)  
Antiguo 15/02/2012, 10:03
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 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`)