Есть несколько вещей, которые могут вызвать ошибку errno 150, поэтому для людей, ищущих эту тему, вот что я думаю, это почти полный список (источник Причины ошибки Errno 150 ):
Для errno 150 или errno 121, просто набрав в SHOW ENGINE INNODB STATUS, есть раздел под названием «ПОСЛЕДНЯЯ ОШИБКА ИНОСТРАННЫХ КЛЮЧЕЙ». При этом он даст вам очень полезное сообщение об ошибке, которое, как правило, сразу скажет вам, в чем дело. Вам нужны привилегии SUPER для его запуска, поэтому, если у вас его нет, вам просто нужно протестировать следующие сценарии.
1) Типы данных не совпадают: типы столбцов должны быть одинаковыми
2) Родительские столбцы не проиндексированы (или проиндексированы в неправильном порядке)
3) Столбцы столбцов не совпадают
4) Использование SET NULL в столбце NOT NULL
5) Совпадения таблиц не совпадают: даже если сопоставления столбцов совпадают, в некоторых версиях MySQL это может быть проблемой.
6) Родительский столбец фактически не существует в родительской таблице. Проверьте орфографию (и, возможно, пробел в начале или конце столбца)
7) Один из индексов в одном из столбцов является неполным или столбец слишком длинный для полного индекса. Обратите внимание, что максимальная длина ключа в одном столбце (если вы его не настроите) составляет 767 байт (это соответствует столбцу UTF varchar (255))
В случае, если вы получите errno 121, вот несколько причин:
1) Выбранное вами имя ограничения уже занято
2) В некоторых системах, если есть разница в именах ваших операторов и таблиц. Это может укусить вас, если вы переходите с одного сервера на другой, у которого разные правила обработки обращений.