MySQL 错误 1005 (errno: 150) 深度解析与解决方案

这个错误是MySQL中非常常见的外键约束创建失败错误。

错误本质

错误信息:

复制代码
`1005 - Can't create table 'zkac.#sql-1350_1' (errno: 150)`

这表示MySQL在尝试创建表或添加外键约束时失败了,具体是外键约束创建过程中遇到了问题。

根本原因排查清单

1. 数据类型不匹配(最常见原因)

  • 检查方法 :

    sql

    复制代码
    `SHOW CREATE TABLE navigation_target_point_info;
    SHOW CREATE TABLE task_type_info;`
  • 必须满足 :

    • ntpi_task_type_name和robot_task_type_name的数据类型完全一致
    • 对于字符串类型,长度、字符集和排序规则也必须一致

2. 被引用列不是主键或唯一键

  • 检查方法 :

    sql

    复制代码
    `SHOW INDEX FROM task_type_info WHERE Key_name = 'PRIMARY' OR Column_name = 'robot_task_type_name';`
  • 解决方案 :

    复制代码

    sql

    复制代码
    `-- 如果不是主键或唯一键,需要添加
    ALTER TABLE task_type_info ADD UNIQUE INDEX idx_robot_task_type_name (robot_task_type_name);`

3. 存储引擎不支持外键

  • 检查方法 :

    复制代码

    sql

    复制代码
    `SHOW TABLE STATUS LIKE 'navigation_target_point_info';
    SHOW TABLE STATUS LIKE 'task_type_info';`
  • 解决方案 :

    sql

    复制代码
    `-- 转换为InnoDB引擎
    ALTER TABLE navigation_target_point_info ENGINE=InnoDB;
    ALTER TABLE task_type_info ENGINE=InnoDB;`

4. 数据不一致问题

  • 检查方法 :

    sql

    复制代码
    `-- 查找外键表中有但主键表中没有的值
    SELECT DISTINCT ntpi.ntpi_task_type_name 
    FROM navigation_target_point_info ntpi
    LEFT JOIN task_type_info tti ON ntpi.ntpi_task_type_name = tti.robot_task_type_name
    WHERE ntpi.ntpi_task_type_name IS NOT NULL AND tti.robot_task_type_name IS NULL;`
  • 解决方案 :

    • 删除无效数据
    • 或在主表中添加缺失的记录

5. 表不存在或列名错误

  • 检查方法 :

    sql

    复制代码
    `-- 确认表和列是否存在
    SELECT * FROM information_schema.COLUMNS 
    WHERE TABLE_SCHEMA = 'zkac' 
    AND TABLE_NAME IN ('navigation_target_point_info', 'task_type_info')
    AND COLUMN_NAME IN ('ntpi_task_type_name', 'robot_task_type_name');`
相关推荐
for_ever_love__2 分钟前
MySQL 8.0 数据类型选型指南:INT、DECIMAL、VARCHAR 与时间字段怎么选
mysql·adb·数据类型·varchar·长度·字段类型选择
xiaogai_gai9 分钟前
销售出库单同步实战:旺店通→金蝶云星空的单一策略深度拆解
大数据·前端·数据库
下页、再停留12 分钟前
【C#桌面客户端系列学习-11】将SQLite数据库打包到exe里
数据库·c#·visual studio
下页、再停留13 分钟前
【C#桌面客户端系列学习-12】封装SQLite数据库基础操作工具类(CURD)
数据库·c#·visual studio
LYmatch17 分钟前
2024年408真题第41~47题汇总解析
数据库
程序员Sunday23 分钟前
Redis 缓存穿透、击穿、雪崩怎么区分?从回源压力找原因
数据库·redis·缓存
我科绝伦(Huanhuan Zhou)27 分钟前
磐维数据库(PanWeiDB)日常运维命令总结
运维·数据库
guo_wen_qiang33 分钟前
redis实现秒杀功能-超卖&库存遗留问题的解决
数据库·redis·缓存
逐流人38 分钟前
Redis内存数据库:从数据类型到集群部署
linux·运维·数据库·redis·缓存·云计算
张张123y1 小时前
# 后端第七课:FastAPI 实战入门(用刚学的 Python 写第一个 API 接口)
开发语言·python·mysql·api·fastapi