Ver Mensaje Individual
  #6 (permalink)  
Antiguo 14/09/2013, 17:29
Avatar de gnzsoloyo
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, 5 meses
Puntos: 2658
Respuesta: Error al relacionar claves foraneas en Clave compuesta

Bueno, gracias por finalmente poner las sentencias de creación. Ahora algunas cosas resultan más claras.
Por lo pronto, el esquema de creación de todas las tablas, incluyendo las FK en la definición de la última, funciona bien:
Código MySQL:
Ver original
  1. mysql>
  2. mysql> CREATE TABLE `primeratabla` (
  3.     -> `idtabla1` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  4.     -> `otrocampo` VARCHAR(10) NOT NULL,
  5.     -> `yotro` VARCHAR(10) NOT NULL,
  6.     -> PRIMARY KEY (`idtabla1`)
  7.     -> ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
  8. Query OK, 0 rows affected (0.01 sec)
  9.  
  10. mysql>
  11. mysql> CREATE TABLE `segundatabla` (
  12.     -> `idtabla2` SMALLINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
  13.     -> `uncampomas` VARCHAR(10) NOT NULL,
  14.     -> `unomas` VARCHAR(10) NOT NULL,
  15.     -> PRIMARY KEY (`idtabla2`)
  16.     -> ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
  17. Query OK, 0 rows affected (0.01 sec)
  18.  
  19. mysql>
  20. mysql> CREATE TABLE `relacion-primeratabla-segundatabla` (
  21.     -> `idtabla1` INT UNSIGNED NOT NULL,
  22.     -> `idtabla2` SMALLINT(3) UNSIGNED NOT NULL,
  23.     -> FOREIGN KEY ( `idtabla1` ) REFERENCES `primeratabla` (`idtabla1`) ON DELETE RESTRICT ON UPDATE CASCADE,
  24.     -> FOREIGN KEY ( `idtabla2` ) REFERENCES `segundatabla` (`idtabla2`) ON DELETE RESTRICT ON UPDATE CASCADE,
  25.     -> PRIMARY KEY (`idtabla1`,`idtabla2`)
  26.     -> ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
  27. Query OK, 0 rows affected (0.06 sec)
Evidentemente, eso no tiene problemas de tipo de dato, o de sintaxis.
hacerlo en dos etapas requiere, como es evidente, no definirle más que la PK a la tercera tabla desde inicio:
Código MySQL:
Ver original
  1. mysql> CREATE TABLE `primeratabla` (
  2.     -> `idtabla1` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  3.     -> `otrocampo` VARCHAR(10) NOT NULL,
  4.     -> `yotro` VARCHAR(10) NOT NULL,
  5.     -> PRIMARY KEY (`idtabla1`)
  6.     -> ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
  7. Query OK, 0 rows affected (0.01 sec)
  8.  
  9. mysql>
  10. mysql> CREATE TABLE `segundatabla` (
  11.     -> `idtabla2` SMALLINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
  12.     -> `uncampomas` VARCHAR(10) NOT NULL,
  13.     -> `unomas` VARCHAR(10) NOT NULL,
  14.     -> PRIMARY KEY (`idtabla2`)
  15.     -> ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
  16. Query OK, 0 rows affected (0.01 sec)
  17.  
  18. mysql>
  19. mysql> CREATE TABLE `relacion-primeratabla-segundatabla` (
  20.     -> `idtabla1` INT UNSIGNED NOT NULL,
  21.     -> `idtabla2` SMALLINT(3) UNSIGNED NOT NULL,
  22.     -> PRIMARY KEY (`idtabla1`,`idtabla2`)
  23.     -> ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
  24. Query OK, 0 rows affected (0.01 sec)
  25.  
  26. mysql>
  27. mysql> ALTER TABLE `relacion-primeratabla-segundatabla`
  28.     -> ADD FOREIGN KEY ( `idtabla1` ) REFERENCES `primeratabla` (`idtabla1`)
  29. Query OK, 0 rows affected (0.03 sec)
  30. Records: 0  Duplicates: 0  Warnings: 0
  31.  
  32. mysql>
  33. mysql> ALTER TABLE  `relacion-primeratabla-segundatabla`
  34.     -> ADD FOREIGN KEY ( `idtabla2` ) REFERENCES `segundatabla` (`idtabla2`)
  35. Query OK, 0 rows affected (0.07 sec)
  36. Records: 0  Duplicates: 0  Warnings: 0
Tampoco causa problemas, por lo cual no se ve defectos en ningún caso.
Francamente, llegado a este punto sólo puedo suponer que el problema está en la versión del phpMyadmin, o algo semejante, ya que al no ser parte de MySQL (es una interfaz programada en PHP), y realizar internamente la creación de las sentencias que envía a MySQL, hay un margen de error probable.
Como sea, ni la definición de las tablas está mal, ni tampoco las de las FK.

Finalmente, es posible que haya resultado demasiado áspera mi reacción, el problema es que me cansa sobremanera pedir específicamente que posteen el CREATE TABLE, para que me terminen contestando con descripciones vagas, que ocultan mas cosas de las que aclaran.
Lo siento si fue excesivo. En algún momento me sacan de las casillas, porque es como si no leyesen lo que se les pide.

Como sea, mis disculpas.

Volviendo al tema, hay sí un par de consejos para que tengas en cuenta:
1) Nunca uses caracteres reservados en los nombres de objetos de bases de datos. No se deben usar dentro de los nombres ni paréntesis, si signos aritméticos, porque en algún momento, por más precauciones que tengas, se producirá un error sintáctico a causa de ellos.
2) No pongas el "rango" de un tipo de dato numérico entero, sólo sirven en el DECIMAL. Ese "(3)" que le pusiste al SMALLINT no genera ningún tipo de efecto al rango de representación, y puede causarte problemas luego si usas VIEWs. Ese valor numérico no representa el ancho de las cifras. Ponerlo, especialmente cuando es menor que el real, lo único que hará es confundirte y crearte problemas en el futuro.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)