创建MySQL关联表时添加外键报错#1822:被引用表缺少索引
搞定MySQL外键添加报错#1822的问题
嘿,你遇到的这个#1822错误其实很好解决——核心问题出在你的medication表上:外键要引用的med_id列既不是主键,也没有唯一索引。MySQL对外键的要求很明确:被引用的列必须能唯一标识一条记录,要么是主键,要么得有唯一索引,不然数据库没法保证你关联的是合法的、唯一的药品记录。
具体修复步骤来啦:
- 第一步,先给
medication的med_id加上主键约束(这是最合理的,毕竟med_id应该是每个药品的唯一标识):
ALTER TABLE `medication` ADD PRIMARY KEY (`med_id`);
⚠️ 注意:如果你的medication表已经有重复的med_id数据,这条语句会失败,得先把重复的med_id清理掉,确保每一行的med_id都是独一无二的。
- 要是你不想把
med_id设为主键,也可以给它加个唯一索引:
CREATE UNIQUE INDEX idx_med_id ON `medication`(`med_id`);
- 等上面的操作完成后,再重新执行你原来的外键添加语句就没问题了:
ALTER TABLE `med_pharmacy` ADD CONSTRAINT `fk_med_pharmacy_medication1` FOREIGN KEY (`med_id`) REFERENCES `medication` (`med_id`) ON DELETE CASCADE ON UPDATE CASCADE;
额外提个小建议:
看你给的medication建表语句,med_id只标了NOT NULL但没设主键,其实最好在创建表的时候就直接把主键加上,比如改成这样:
DROP TABLE IF EXISTS `medication`; CREATE TABLE `medication` ( `med_id` int(11) NOT NULL PRIMARY KEY, `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;
这样后续加外键就不会踩这个坑啦~
内容的提问来源于stack exchange,提问作者alim1990
相关产品推荐
相关产品推荐

