Cách fix lỗi missing index for constraint trong MySQL - MySQL nâng cao
Bạn đang tạo khóa ngoại nhưng gặp lỗi "missing index for constraint" trong MySQL? Vậy thì hãy tham khảo bài hướng dẫn này nhé, mình sẽ giúp bạn fix lỗi đó. Nếu dịch ra tiếng Anh thì nó rất rõ nghĩa, đây là lỗi bị thiếu chỉ mục cho ràng buộc khóa ngoại. Theo như quy tắc thì khá ngoại của bảng con ...
Bạn đang tạo khóa ngoại nhưng gặp lỗi "missing index for constraint" trong MySQL? Vậy thì hãy tham khảo bài hướng dẫn này nhé, mình sẽ giúp bạn fix lỗi đó.
Nếu dịch ra tiếng Anh thì nó rất rõ nghĩa, đây là lỗi bị thiếu chỉ mục cho ràng buộc khóa ngoại. Theo như quy tắc thì khá ngoại của bảng con phải trỏ đến khóa chính của bảng cha, nhưng bạn đã không tạo khóa chính cho bảng cha.
Vì vậy giải pháp là bạn phải tạo chỉ mục khóa chính trước khi tạo khóa ngoai nhé.
Mình sẽ lấy một ví dụ trên stackoverflow luôn nhé.
Tạo bảng con med_pharmacy
DROP TABLE IF EXISTS `med_pharmacy`; CREATE TABLE IF NOT EXISTS `med_pharmacy` ( `med_pharmacy_id` int(11) NOT NULL AUTO_INCREMENT, `med_id` int(11) NOT NULL, `med_barcode` varchar(45) DEFAULT NULL, `med_received` date DEFAULT NULL, `med_expiry` date DEFAULT NULL, `med_tablet` int(11) DEFAULT NULL, `med_pill` int(11) DEFAULT NULL, `clinic_id` varchar(45) DEFAULT NULL, PRIMARY KEY (`med_pharmacy_id`), KEY `fk_med_pharmacy_medication1_idx` (`med_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1261 DEFAULT CHARSET=utf8mb4;
Tạo bảng cha medication
DROP TABLE IF EXISTS `medication`; CREATE TABLE `medication` ( `med_id` int(11) NOT NULL, `med_name` varchar(75) NOT NULL, `med_date_added` date DEFAULT NULL, `clinic_id` varchar(45) DEFAULT NULL, `med_type` varchar(15) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Bây giờ thêm khóa ngoại bằng lệnh SQL:
ALTER TABLE `med_pharmacy` ADD CONSTRAINT `fk_med_pharmacy_medication1` FOREIGN KEY (`med_id`) REFERENCES `medication` (`med_id`) ON DELETE CASCADE ON UPDATE CASCADE MySQL
Thì xuất hiện lỗi:
#1822 - Failed to add the foreign key constaint. Missing index for constraint 'fk_med_pharmacy_medication1' in the referenced table 'medication'
Nó nói khá rõ ràng, trong bảng medication bạn đã không tạo khóa chính cho med_id.
Vì vậy hãy thêm nó bằng lệnh sau:
ALTER TABLE medication ADD PRIMARY KEY (med_id);
Rồi chạy lại lệnh tạo kháo ngoại ở trên nhé.
ALTER TABLE `med_pharmacy` ADD CONSTRAINT `fk_med_pharmacy_medication1` FOREIGN KEY (`med_id`) REFERENCES `medication` (`med_id`) ON DELETE CASCADE ON UPDATE CASCADE MySQL
Như vậy là mình đã hướng dẫn xong cách khắc phục lỗi "missing index for constraint" trong MySQL. Chúc bạn thành công!