Có khá nhiều thứ có thể gây ra lỗi 150, vì vậy đối với những người tìm kiếm chủ đề này, đây là những gì tôi nghĩ là gần với danh sách đầy đủ (nguồn Nguyên nhân của Errno 150 ):
Đối với errno 150 hoặc errno 121, chỉ cần gõ vào TÌNH TRẠNG SHOW Engine INNODB, có một phần gọi là "LRI TỪ KHÓA NGOẠI TỆ MỚI NHẤT". Theo đó nó sẽ cung cấp cho bạn một thông báo lỗi rất hữu ích, thông thường sẽ cho bạn biết ngay vấn đề là gì. Bạn cần các đặc quyền SIÊU để chạy nó, vì vậy nếu bạn không có điều đó, bạn sẽ phải kiểm tra các tình huống sau.
1) Kiểu dữ liệu không khớp: Các loại cột phải giống nhau
2) Cột cha mẹ không được lập chỉ mục (hoặc được lập chỉ mục theo thứ tự sai)
3) Ghép cột Không khớp
4) Sử dụng SET NULL trên cột KHÔNG NULL
5) Ghép bảng không khớp: ngay cả khi đối chiếu cột khớp với nhau, trên một số phiên bản MySQL, đây có thể là một vấn đề.
6) Cột cha mẹ không thực sự tồn tại trong bảng cha mẹ. Kiểm tra chính tả (và có lẽ là khoảng trắng ở đầu hoặc cuối cột)
7) Một trong các chỉ mục trên một trong các cột không đầy đủ hoặc cột quá dài cho một chỉ mục hoàn chỉnh. Lưu ý rằng MySQL (trừ khi bạn tinh chỉnh nó) có độ dài khóa cột tối đa là 767 byte (điều này tương ứng với cột UTF (255) varchar)
Trong trường hợp bạn gặp lỗi 121, đây là một số nguyên nhân:
1) Tên ràng buộc bạn chọn đã được sử dụng
2) Trên một số hệ thống nếu có sự khác biệt trong trường hợp tên và bảng của bạn. Điều này có thể cắn bạn nếu bạn đi từ máy chủ này sang máy chủ khác có các quy tắc xử lý trường hợp khác nhau.