Ci sono alcune cose che possono causare errno 150, quindi per le persone che cercano questo argomento, ecco quello che penso sia un elenco vicino all'esaustivo (fonte Cause di Errno 150 ):
Per errno 150 o errno 121, semplicemente digitando SHOW ENGINE INNODB STATUS, c'è una sezione chiamata "LATEST KEY ERROR ESTERO". Sotto questo ti darà un messaggio di errore molto utile, che in genere ti dirà subito qual è il problema. Hai bisogno dei privilegi SUPER per eseguirlo, quindi se non lo possiedi, dovrai solo provare i seguenti scenari.
1) I tipi di dati non corrispondono: i tipi di colonne devono essere uguali
2) Colonne principali non indicizzate (o indicizzate in ordine errato)
3) Le regole di confronto delle colonne non corrispondono
4) Utilizzo di SET NULL su una colonna NOT NULL
5) Le regole di confronto delle tabelle non corrispondono: anche se le regole di confronto delle colonne corrispondono, in alcune versioni di MySQL questo può essere un problema.
6) La colonna padre non esiste realmente nella tabella padre. Controlla l'ortografia (e forse uno spazio all'inizio o alla fine della colonna)
7) Uno degli indici su una delle colonne è incompleto o la colonna è troppo lunga per un indice completo. Nota che MySQL (a meno che non lo modifichi) ha una lunghezza massima della chiave a colonna singola di 767 byte (corrisponde a una colonna UTF varchar (255))
Nel caso in cui ricevi un errore 121, ecco un paio di cause:
1) Il nome del vincolo scelto è già stato preso
2) Su alcuni sistemi se c'è una differenza tra maiuscole e minuscole nell'istruzione e nei nomi delle tabelle. Questo può morderti se passi da un server a un altro con regole di gestione dei casi diverse.