Hay bastantes cosas que pueden causar errno 150, por lo que para las personas que buscan este tema, esto es lo que creo que es una lista cercana a exhaustiva ( Causas de origen de Errno 150 ):
Para errno 150 o errno 121, simplemente escribiendo SHOW ENGINE INNODB STATUS, hay una sección llamada "ÚLTIMO ERROR DE CLAVE EXTRANJERA". Debajo de eso, le dará un mensaje de error muy útil, que generalmente le dirá de inmediato cuál es el problema. Necesitas privilegios SUPER para ejecutarlo, así que si no tienes eso, solo tendrás que probar los siguientes escenarios.
1) Los tipos de datos no coinciden: los tipos de las columnas deben ser los mismos
2) Columnas principales no indexadas (o indexadas en orden incorrecto)
3) Las colaciones de columnas no coinciden
4) Usar SET NULL en una columna NOT NULL
5) Las intercalaciones de tablas no coinciden: incluso si las intercalaciones de columnas coinciden, en algunas versiones de MySQL esto puede ser un problema.
6) La columna principal no existe realmente en la tabla principal. Revise la ortografía (y quizás un espacio al principio o al final de la columna)
7) Uno de los índices en una de las columnas está incompleto, o la columna es demasiado larga para un índice completo. Tenga en cuenta que MySQL (a menos que lo ajuste) tiene una longitud máxima de clave de una sola columna de 767 bytes (esto corresponde a una columna UTF varchar (255))
En caso de que obtenga un errno 121, aquí hay un par de causas:
1) El nombre de restricción que eligió ya está tomado
2) En algunos sistemas si hay una diferencia de caso en su declaración y nombres de tabla. Esto puede morderte si vas de un servidor a otro que tiene diferentes reglas de manejo de casos.