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');`
相关推荐
逻辑驱动的ken1 小时前
Java高频面试考点18
java·开发语言·数据库·算法·面试·职场和发展·哈希算法
qq_392690661 小时前
Redis怎样应对Redis集群整体宕机带来的雪崩
jvm·数据库·python
快乐非自愿2 小时前
Redis--SDS字符串与集合的底层实现原理
数据库·redis·缓存
这儿有一堆花2 小时前
住宅代理(Residential Proxy)技术指南
开发语言·数据库·php
茉莉玫瑰花茶3 小时前
LangChain 核心组件 [ 2 ]
java·数据库·langchain
存在的五月雨3 小时前
Mysql 索引的一些
数据库·mysql
黄俊懿4 小时前
MySQL主从复制:从“异步“到“GTID“,数据同步的进化之路
数据库·sql·mysql·oracle·架构·dba·db
看海的四叔4 小时前
【SQL】SQL-管好你的字符串
大数据·数据库·hive·sql·数据分析·字符串
秋95 小时前
TiDB 数据库全链路实战指南:从下载部署到 Java 高并发调优
java·数据库·tidb
zhou周大哥5 小时前
银河麒麟安装mysql
数据库·mysql