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_namerobot_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');`
相关推荐
Mr.朱鹏3 小时前
Linux 服务器 LVM 根分区在线动态扩容
linux·服务器·数据库
摇滚侠3 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 数据库初始化机制 阅读笔记 36
数据库·spring boot·笔记
qiuhaipeng13 小时前
Claude code 升级后上下文长度变短问题
java·前端·数据库
云贝贝贝4 小时前
腾讯云 TDSQL(MySQL 版)运维高频 6 坑:代理路由、读写分离、分片键、监控、PITR
运维·mysql·腾讯云
wxwx_bscxy3224 小时前
基于Python新冠疫情可视化分析系统的设计与实现
java·数据库·spring boot·python·微信小程序·sqlite
剑之所向5 小时前
.NET 官方`System.Threading.Channels`
前端·javascript·数据库
词却5 小时前
数据库基础:DQL 数据查询语言
数据库·oracle
昌原的儿子LEO7 小时前
Linux IO多路复用与SQLite数据库核心知识点总结
linux·数据库·oracle
山岚的运维笔记7 小时前
mysql 专业笔记 -- 第 8 章:使用变量
运维·数据库·笔记·后端·学习·mysql·dba
聚美智数7 小时前
网安查询-备案查询-网络安全查询API接口介绍
网络·数据库·web安全