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');`
相关推荐
小陈工2 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
0xDevNull6 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花7 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸7 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain7 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希7 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神7 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员7 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java8 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿8 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb