Istnieje wiele rzeczy, które mogą powodować errno 150, więc dla osób szukających w tym temacie, moim zdaniem, jest to lista bliska wyczerpującej (źródło Przyczyny Errno 150 ):
W przypadku errno 150 lub errno 121, po prostu wpisując SHOW ENGINE INNODB STATUS, pojawia się sekcja o nazwie "LATEST FOREIGN KEY ERROR". Pod tym hasłem wyświetli bardzo pomocny komunikat o błędzie, który zazwyczaj od razu powie Ci, o co chodzi. Potrzebujesz SUPER uprawnień, aby go uruchomić, więc jeśli ich nie masz, musisz po prostu przetestować następujące scenariusze.
1) Nie pasują typy danych: typy kolumn muszą być takie same
2) Kolumny nadrzędne niezindeksowane (lub zindeksowane w niewłaściwej kolejności)
3) Kolumny nie pasują do siebie
4) Użycie SET NULL na kolumnie NOT NULL
5) Kolacje tabel nie są zgodne: nawet jeśli sortowania kolumn są zgodne, w niektórych wersjach MySQL może to być problem.
6) Kolumna nadrzędna w rzeczywistości nie istnieje w tabeli nadrzędnej. Sprawdź pisownię (i być może spację na początku lub na końcu kolumny)
7) Jeden z indeksów na jednej z kolumn jest niekompletny lub kolumna jest za długa, aby uzyskać pełny indeks. Zauważ, że MySQL (chyba że go zmodyfikujesz) ma maksymalną długość klucza pojedynczej kolumny wynoszącą 767 bajtów (odpowiada to kolumnie varchar (255) UTF)
Jeśli otrzymasz errno 121, oto kilka przyczyn:
1) Wybrana nazwa ograniczenia jest już zajęta
2) W niektórych systemach, jeśli występuje różnica wielkości liter w instrukcjach i nazwach tabel. Może cię to ugryźć, jeśli przejdziesz z jednego serwera na inny, na którym obowiązują inne zasady obsługi spraw.