You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:44:17