创建MySQL departments表时触发外键约束错误(errno:150),如何解决?
出现Can't create table ... (errno: 150 "Foreign key constraint is incorrectly formed")错误,是因为外键约束的定义不符合MySQL的要求,以下是具体排查和解决步骤:
确认关联表
locations已存在
要创建departments的外键,必须先确保myemployees数据库中已经存在locations表,且该表使用InnoDB引擎(MySQL仅InnoDB支持外键约束)。如果locations表未创建,需先完成该表的创建。保证关联字段数据类型完全匹配
外键字段departments.location_id定义为int(4),那么locations表中的location_id字段必须和它完全一致,包括数据类型、长度、是否无符号、是否允许为空等属性。例如,如果locations.location_id是int(11)或unsigned int(4),都会触发约束错误。确认主表关联字段是主键或唯一键
外键引用的locations.location_id必须是locations表的主键(PRIMARY KEY),或者是唯一索引(UNIQUE KEY)。普通索引无法作为外键的关联目标。检查两个表的存储引擎一致
departments使用InnoDB引擎,locations也必须使用InnoDB。如果locations是MyISAM引擎,要么将其转换为InnoDB,要么移除departments中的外键约束。核对表的字符集一致
departments的字符集是gb2312,locations表的字符集也需设置为gb2312,字符集不匹配也会导致外键约束创建失败。
示例修正流程
- 先创建符合要求的
locations表(示例结构):
CREATE TABLE `locations` ( `location_id` int(4) NOT NULL AUTO_INCREMENT, `street_address` varchar(40) DEFAULT NULL, `postal_code` varchar(12) DEFAULT NULL, -- 其他业务字段 PRIMARY KEY (`location_id`) ) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
- 再执行
departments表的创建语句,即可成功创建外键约束。
内容的提问来源于stack exchange,提问作者ARPATNURMAMAT

