MySQL创建表时出现Foreign key constraint is incorrectly formed错误求助
问题描述
我在MySQL中开发数据库,尝试创建如下数据表:
CREATE TABLE Services ( srv_id int NOT NULL PRIMARY KEY, srv_description char(100) NOT NULL ); CREATE TABLE Categories( ctg_id INT NOT NULL PRIMARY KEY, ctg_description char(25) NOT NULL ); CREATE TABLE Bathhouses( bth_id int NOT NULL PRIMARY KEY, bth_name char(25) NOT NULL UNIQUE, bth_start_date date NOT NULL CHECK (MONTH(bth_start_date) > 3), bth_end_date date NOT NULL CHECK (MONTH(bth_end_date) < 11), bth_address char(25) NOT NULL, ctg_id INT NOT NULL, FOREIGN KEY (ctg_id) REFERENCES Categories(ctg_id) ); CREATE TABLE Customers( cus_id int NOT NULL PRIMARY KEY, cus_name char(25) NOT NULL, cus_surname char(25) NOT NULL, cus_birthdate date NOT NULL, cus_sexgender ENUM('male ', 'female', 'other') ); CREATE TABLE CustomersServicesUses ( cussruvuses_id int NOT NULL PRIMARY KEY, cus_id int NOT NULL, srv_id int NOT NULL, cussruvuses_isSubscriber tinyint(1) NOT NULL, FOREIGN KEY (cus_id) REFERENCES Customers(cus_id), FOREIGN KEY (srv_id) REFERENCES Services(srv_id) );
创建CustomersServicesUses表时遇到错误:
Unable to create tablebathhouses.customersservicesuses(errno: 150 "Foreign key constraint is incorrectly formed") (Details…)
我排查了常见的外键错误原因(如目标表多主键、关联字段类型/名称不匹配),但都不符合我的情况。附上InnoDB监控的关键错误日志:
------------------------ LATEST FOREIGN KEY ERROR ------------------------ 2022-12-16 21:02:05 0x5158 Error in foreign key constraint of table `bathhouses`.`customersservicesuses`: Create table `bathhouses`.`customersservicesuses` with foreign key constraint failed. Referenced table `bathhouses`.`services` not found in the data dictionary near 'FOREIGN KEY (srv_ID) REFERENCES Services(srv_ID) )'.
请问这个错误的原因是什么?
错误原因
从InnoDB给出的最新外键错误日志可以直接定位问题:
Referenced table
bathhouses.servicesnot found in the data dictionary
本质是MySQL在创建CustomersServicesUses表时,找不到你要关联的Services表,具体可能有以下几种触发场景:
Services表未成功创建:执行建表语句时,Services表的创建语句可能存在未被察觉的语法错误,导致表没有实际生成。- 表名大小写不匹配:如果你的操作系统是Linux这类区分大小写的系统,MySQL表名会区分大小写。比如实际创建的是小写
services表,但外键关联写的是大写Services,就会出现找不到表的情况。 - 数据库上下文错误:你可能在其他数据库下创建了
Services表,但创建CustomersServicesUses表时切换到了bathhouses库,跨库关联时未指定完整库名,导致找不到表。
解决建议
- 在当前数据库执行
SHOW TABLES;,确认Services表是否存在。 - 如果表不存在,重新执行
Services表的建表语句,检查语句是否有语法错误(比如遗漏分号、关键字拼写错误等)。 - 如果表存在但大小写不匹配,修改外键关联语句中的表名为实际存在的大小写,或者统一所有表名的大小写规范。
- 如果是跨库问题,在外键关联时指定完整的表名格式:
FOREIGN KEY (srv_id) REFERENCES 目标数据库名.Services(srv_id)。
内容的提问来源于stack exchange,提问作者Conta
相关产品推荐
相关产品推荐

