Existem algumas coisas que podem causar o erro 150, portanto, para as pessoas que pesquisam neste tópico, aqui está o que eu acho que é uma lista quase exaustiva (fonte Causes of Errno 150 ):
Para o erro 150 ou o erro 121, basta digitar SHOW ENGINE INNODB STATUS, existe uma seção chamada "ÚLTIMO ERRO DE CHAVE ESTRANGEIRA". Com isso, será exibida uma mensagem de erro muito útil, que normalmente informa imediatamente qual é o problema. Você precisa de privilégios SUPER para executá-lo; portanto, se você não tiver isso, precisará apenas testar os seguintes cenários.
1) Os tipos de dados não correspondem: os tipos das colunas devem ser os mesmos
2) Colunas pai não indexadas (ou indexadas por ordem incorreta)
3) Os agrupamentos de colunas não correspondem
4) Usando SET NULL em uma coluna NOT NULL
5) Os agrupamentos de tabelas não correspondem: mesmo que os agrupamentos de colunas correspondam, em algumas versões do MySQL isso pode ser um problema.
6) A coluna pai não existe realmente na tabela pai. Verificar ortografia (e talvez um espaço no início ou no final da coluna)
7) Um dos índices em uma das colunas está incompleto ou a coluna é muito longa para um índice completo. Observe que o MySQL (a menos que você o ajuste) possui um comprimento máximo de chave de coluna única de 767 bytes (isso corresponde a uma coluna UTF varchar (255))
Caso você receba um erro 121, eis algumas causas:
1) O nome da restrição que você escolheu já está em uso
2) Em alguns sistemas, se houver uma diferença entre maiúsculas e minúsculas nos seus extratos e nomes de tabelas. Isso pode incomodá-lo se você for de um servidor para outro que possua regras de tratamento de casos diferentes.