Є досить багато речей, які можуть спричинити помилку 150, тому для людей, які шукають цю тему, ось що, на мою думку, є близьким до вичерпного списку (джерело Причини Errno 150 ):
Для errno 150 або errno 121, просто ввівши ПОКАЖИТИ СТАТУТ ДВИГАТЕЛЯ, існує розділ під назвою "ПОСЛІДНА ПОМИЛКА ІНТЕРНЕТ-КЛЮЧ". З цього приводу ви отримаєте дуже корисне повідомлення про помилку, яке, як правило, відразу скаже вам, у чому справа. Для його запуску потрібні привілеї SUPER, тому якщо у вас цього немає, вам просто доведеться перевірити наступні сценарії.
1) Типи даних не збігаються: типи стовпців повинні бути однаковими
2) Батьківські стовпці не індексуються (або індексуються в неправильному порядку)
3) Збірки стовпців не збігаються
4) Використання SET NULL у стовпці NOT NULL
5) Збір таблиці не відповідає: навіть якщо порівняння стовпців збігаються, у деяких версіях MySQL це може бути проблемою.
6) Батьківська колонка насправді не існує в батьківській таблиці. Перевірте правопис (і можливо пробіл на початку чи в кінці стовпця)
7) Один з індексів на одному з стовпців є неповним або стовпчик занадто довгий для повного індексу. Зауважте, що MySQL (якщо ви не налаштовуєте його) має максимальну довжину ключа одного стовпчика 767 байт (це відповідає стовпцю varchar (255) UTF)
Якщо ви отримали помилку 121, ось кілька причин:
1) Ім'я обмеження, яке ви вибрали, вже прийняте
2) У деяких системах, якщо в назвах ваших операторів та таблиць є різниця в регістрі. Це може вас вкусити, якщо ви переходите з одного сервера на інший, який має різні правила обробки справ.