MySQL两表外键添加失败求助:如何正确创建companies与industries外键约束?
解决MySQL外键约束添加失败的问题
兄弟,你这外键的方向完全搞反啦!咱们先理清楚表之间的逻辑关系:
industries是行业主表,它的id是主键,用来唯一标识每个行业;companies是公司子表,每个公司属于一个行业,所以companies.industry_id是用来关联行业的字段。
外键约束应该建在子表的关联字段上,指向主表的主键,而不是反过来操作主表。
正确的外键创建语句
直接执行这条SQL就能成功添加外键:
ALTER TABLE companies ADD FOREIGN KEY (industry_id) REFERENCES industries(id) ON DELETE RESTRICT;
额外排查点(如果还是报错的话)
如果执行上述语句依然提示Cannot add foreign key constraint,可以检查以下几点:
- 字段类型必须完全匹配:你的两个表中
industries.id和companies.industry_id都是int(11),这点没问题,但如果类型(比如一个是int一个是bigint)、是否允许为空的设置不匹配,会导致失败。 - 子表已有数据必须合法:如果
companies表中已经存在industry_id值,但这些值在industries表的id中找不到对应记录,外键会创建失败。可以用这条SQL排查无效数据:
要是有结果,要么删除这些无效的公司记录,要么在SELECT DISTINCT industry_id FROM companies WHERE industry_id IS NOT NULL AND industry_id NOT IN (SELECT id FROM industries);industries表中添加对应的行业条目。 - 存储引擎必须支持外键:你的两个表都是
InnoDB,这点没问题——MyISAM引擎不支持外键约束,要是用了这个引擎就得先转成InnoDB。
内容的提问来源于stack exchange,提问作者user137
相关产品推荐
相关产品推荐

