Ngoài hình thức nhiều lý do khác để kết thúc với MySql Lỗi 150 (trong khi sử dụng InnoDB), Một trong những lý do có thể xảy ra, là xác định KEY
trong câu lệnh tạo của bảng chứa tên cột được tham chiếu như một khoá ngoại trong bảng tương đối.
Hãy nói rằng các tạo tuyên bố của bảng tổng thể là -
CREATE TABLE 'master_table' (
'id' int(10) NOT NULL AUTO_INCREMENT,
'record_id' char(10) NOT NULL,
'name' varchar(50) NOT NULL DEFAULT '',
'address' varchar(200) NOT NULL DEFAULT '',
PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
và tạo ra cú pháp cho bảng relative_table nơi ràng buộc khoá ngoại được thiết lập từ bảng chính -
CREATE TABLE 'relative_table' (
'id' int(10) NOT NULL AUTO_INCREMENT,
'salary' int(10) NOT NULL DEFAULT '',
'grade' char(2) NOT NULL DEFAULT '',
'record_id' char(10) DEFAULT NULL,
PRIMARY KEY ('id'),
CONSTRAINT 'fk_slave_master' FOREIGN KEY ('record_id') REFERENCES 'master' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Kịch bản này chắc chắn sẽ kết thúc với lỗi MySql 150 nếu sử dụng InnoDB.
Để giải quyết vấn đề này, chúng tôi cần thêm KEY
cho cột record_id
trong bảng master_table
và sau đó tham chiếu trong bảng relative_table
để được sử dụng làm một ngoại tuyến.
Cuối cùng, tạo ra tuyên bố cho master_table
, sẽ -
CREATE TABLE 'master_table' (
'id' int(10) NOT NULL AUTO_INCREMENT,
'record_id' char(10) NOT NULL,
'name' varchar(50) NOT NULL DEFAULT '',
'address' varchar(200) NOT NULL DEFAULT '',
PRIMARY KEY ('id'),
KEY 'record_id' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Một chút thử nghiệm nhanh, tạo ra một 'foo' như trên với MyISAM, và một' thanh' với InnoDB, cho thấy rằng đó là trường hợp - hãy thử kiểm tra lại kiểu bảng của bạn cho 'foo'. – Rob
+1 cho "Cả hai bảng phải là bảng InnoDB", cảm ơn rất nhiều! – sanbhat
Ngay cả khi cả hai bảng đều là InnoDB, tôi vẫn có cùng một vấn đề. Tôi đã sửa nó bằng cách tạo chỉ mục trên bảng được giới thiệu trước khi tạo khóa ngoài. – IROEGBU