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');`
相关推荐
2603_965148114 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
ltl4 小时前
RocksDB 经典故障排查:L0、compaction 与 write stall
数据库
xfhuangfu5 小时前
Oracle中建立到CDB和PDB的连接
数据库·oracle·rpc
小小龙学IT5 小时前
DuckDB 深度实战:用 C++ 在进程内跑一个「分析型数据库」
数据库·c++
NineData6 小时前
DTCC 2026 预告|NineData CEO& 创始人叶正盛:面向 AI Agent 的数据库 DevOps 与数据复制实践
数据库·人工智能·数据库开发·devops·ninedata·数据库技术·dtcc
J_bean6 小时前
MySQL 事务是否必须手动开启?
数据库·mysql·数据库事务·自动提交·手动提交
J_bean6 小时前
MySQL InnoDB 如何检测死锁、判定死锁、处理死锁
数据库·mysql·死锁·死锁检测·处理死锁·死锁判定
浪子明X7 小时前
从 MongoDB 文档到关系模型:构建可重跑、可对账的数据迁移流水线
数据库·mongodb·oracle
杜子不疼.7 小时前
国产数据库撑起固井软件自主化:金仓 × 中海油服「海恒 Cemsol」落地解析
数据库
隔窗听雨眠7 小时前
GBase 8s并发控制深度解析:封锁机制、隔离级别与死锁处理全攻略
服务器·数据库·oracle