MySQL创建users表报Error 1005 errno150外键约束错误求助
MySQL Error 1005 (errno:150) 外键约束报错解决
问题根因
报错本质是建表顺序不符合外键依赖逻辑:InnoDB引擎创建外键时,要求被引用的父表必须已经存在。你提供的SQL中,先创建带外键的USERS子表,后创建它引用的USER_CATEGORIES、CARTS两张父表,引擎找不到引用目标,直接抛出外键格式错误。
另外原SQL的删表逻辑也有隐患:如果库内已经存在带外键关联的表,先删父表会触发依赖报错,需要按先子表后父表的顺序删除。
常规排查项(同类报错可逐一核对)
- 外键字段与引用的父表字段,数据类型、长度、有符号/无符号属性、字符集必须完全一致:你的字段类型匹配,不存在该问题
- 外键引用的父表字段必须是主键或唯一索引:你引用的都是父表主键,符合要求
- 大小写敏感场景(如Linux默认MySQL配置)下,表名、字段名大小写必须完全匹配:你的命名大小写统一,无该问题
修正后可直接运行的SQL代码
### 建库 CREATE DATABASE IF NOT EXISTS `DB_XCRUZ`; USE `DB_XCRUZ`; ### 建表 -- 按先子表后父表顺序删除已存在的表,避免依赖报错 DROP TABLE IF EXISTS `USERS`; DROP TABLE IF EXISTS `USER_CATEGORIES`; DROP TABLE IF EXISTS `CARTS`; -- 先创建无外键依赖的父表 /* 用户分类表 */ CREATE TABLE `USER_CATEGORIES`( `ID` SMALLINT(3) NOT NULL, `NAME` VARCHAR(80) DEFAULT NULL, PRIMARY KEY (`ID`) ); /* 购物车表 */ CREATE TABLE `CARTS`( `ID` INT NOT NULL, `SUBTOTAL` DECIMAL(11,2) DEFAULT NULL, `TOTAL` DECIMAL(11,2) DEFAULT NULL, PRIMARY KEY (`ID`) ); -- 最后创建带外键依赖的用户表 /* 用户表 */ CREATE TABLE `USERS`( `ID` INT NOT NULL, `FIRST_NAME` VARCHAR(100) DEFAULT NULL, `LAST_NAME` VARCHAR(100) DEFAULT NULL, `EMAIL` VARCHAR(320) DEFAULT NULL, `CATEGORY_ID` SMALLINT(3) NOT NULL, `CART_ID` INT NOT NULL, PRIMARY KEY (`ID`), FOREIGN KEY (`CATEGORY_ID`) REFERENCES USER_CATEGORIES(`ID`) ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY (`CART_ID`) REFERENCES CARTS(`ID`) ON UPDATE CASCADE ON DELETE CASCADE );
排查技巧
如果后续遇到同类150报错找不到原因,直接执行SHOW ENGINE INNODB STATUS;,在输出结果的LATEST FOREIGN KEY ERROR段会明确标注外键创建失败的具体原因,不需要逐行盲查。
内容的提问来源于stack exchange,提问作者BautistaCodes
相关产品推荐
相关产品推荐

