添加多个外键时无法创建SQL表,提示外键约束格式错误
解决MySQL中“Foreign key constraint is incorrectly formed”外键创建错误
嘿,我之前也踩过这个外键的坑!这个错误几乎都是外键约束的定义和关联表的规则不匹配导致的,咱们一步步排查解决:
常见排查点及解决方法
关联字段的类型/属性必须完全匹配
外键字段的类型、长度、是否无符号等属性,必须和关联表的主键(或唯一索引)字段完全一致。比如如果关联表的主键是INT UNSIGNED,你的domain_id是普通INT就会报错;哪怕是INT(11)和INT(10)这种长度差异,也可能触发这个错误。先去核对你要关联的那张表的主键字段属性,确保domain_id和它完全一致。确认关联表存在且拼写正确
要保证你通过REFERENCES关联的表已经提前创建,而且表名拼写完全一致(MySQL在Linux等大小写敏感的系统里,表名大小写必须严格匹配,比如Company和company会被当成不同的表)。检查外键约束的语法是否正确
外键的定义语法很容易写错,正确的格式应该是这样的:CONSTRAINT 约束名 FOREIGN KEY (当前表的外键字段) REFERENCES 关联表名(关联表的主键字段)注意几个点:
- 约束名要唯一,如果你在这个表里加多个外键,每个约束的名字不能重复
- 不要漏写
REFERENCES关键字 - 括号里的字段名不要写错
关联字段必须是关联表的主键或唯一索引
外键只能关联到另一张表的主键字段,或者被标记为UNIQUE的唯一索引字段。如果关联的只是普通字段没有索引,MySQL会直接抛出这个错误。
完整示例参考
假设你要关联的表是companies,它的建表语句是:
CREATE TABLE companies ( id int NOT NULL PRIMARY KEY AUTO_INCREMENT, company_name VARCHAR(200) NOT NULL );
那你的company_domaindetails表正确的建表语句应该是:
CREATE TABLE company_domaindetails ( domain_id int NOT NULL, domain_name VARCHAR(200) NOT NULL, domain_provider VARCHAR(200) NOT NULL, domain_accoemail VARCHAR(200) NOT NULL, domain_allopassword VARCHAR(200) NOT NULL, domain_dns VARCHAR(200) NOT NULL, domain_timeframe VARCHAR(200) NOT NULL, domain_daysremaining VARCHAR(200) NOT NULL, -- 外键约束 CONSTRAINT fk_domain_company FOREIGN KEY (domain_id) REFERENCES companies(id) );
如果按照上面的步骤排查后还是报错,你可以把关联表的建表语句也贴出来,这样能更精准地定位问题~
内容的提问来源于stack exchange,提问作者Nirab Pokharel
相关产品推荐
相关产品推荐

