Mysql…Foreign Key error(150) —algunas precauciones

Es una gran pesadilla intentar hacer llaves foraneas(foreign keys) entre algunas tablas en MySQL y que siempre te salga el bendito: ‘err(150)’, que en realidad no significa nada; es un mensaje de “error general”.  Pelicula de Terror.

Me acaba de suceder, y tanto buscando en internet como pensando un poco(nunca pasa de moda), al final pude hacer las relaciones que necesitaba.  Aqui les dejo una lista de elementos a considerar cada vez que la pesadilla llamada err(150) frustre tus intenciones de “hacer que las tablas se agreguen unas a otras en sus listas de amigos del Mysql Space“:

  • Verifica tipo de dato/tamanio del campo: es lo mas logico, puesto q la misma informacion iria en ambos campos
  • Ambas tablas que sean de motor InnoDB(debe ser asi en primera instancia, para que haya llaves foraneas)
  • Campos tipo BLOB y TEXT no pueden ser llaves foraneas: no hay garantias de que a nivel de bits la informacion se mantenga igual en todos los casos; de modo que mejor abandona y ponte a normalizar e inventa tablas y campos que si puedas enlazar
  • Verifica los “collation”: el collation debe ser el mismo tambien, sino los caracteres pueden malformarse en la relacion, y por lo tanto Mysql no te deja enlazarlas
  • si ya tienes registros en las tablas que ‘alimentan’ a la tabla madre, el campo de la tabla ‘madre’ debe coincidir con los datos de la tabla que alimenta.  Ejemplo:

tienes la tabla “TipoCaballo” que alimenta a la tabla madre “CaballosAlquilados”.  Los registros de la tabla madre, en el campo “CaballosAlquilados.idTipoCaballo” deben tener un valor que corresponda a cualquiera de los que tenga la tabla “TipoCaballo” en su campo “idTipoCaballo”.  Esto debe ser asi incluso antes de hacer la relacion, si no va a enviarte el error de que los datos no coinciden, por lo tanto no puede haber relacion.

Creo que son todas las que utilice para resolver mis asuntos.  Espero que les sirvan, y en tal caso aporten mas DATITOS! para erradicar la tragedia de los err(150) de este mundo!

Anuncios