MySQL错误1005(errno: 150)的原因分析与解决方案

 更新时间:2025年12月09日 09:14:49   作者:0.99栈小臻  
本文详细介绍了MySQL外键约束创建失败错误1005的原因分析及解决方案,主要包括数据类型不匹配、被引用列不是主键或唯一键、存储引擎不支持外键、数据不一致问题和表不存在或列名错误等五个方面,需要的朋友可以参考下

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

错误本质

错误信息

1005 - Can't create table 'zkac.#sql-1350_1' (errno: 150)

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

根本原因排查清单

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

检查方法

SHOW CREATE TABLE navigation_target_point_info;
SHOW CREATE TABLE task_type_info;
  • 必须满足
    • ntpi_task_type_namerobot_task_type_name的数据类型完全一致
    • 对于字符串类型,长度、字符集和排序规则也必须一致

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

检查方法

SHOW INDEX FROM task_type_info WHERE Key_name = 'PRIMARY' OR Column_name = 'robot_task_type_name';

解决方案

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

3. 存储引擎不支持外键

检查方法

SHOW TABLE STATUS LIKE 'navigation_target_point_info';
SHOW TABLE STATUS LIKE 'task_type_info';

解决方案

-- 转换为InnoDB引擎
ALTER TABLE navigation_target_point_info ENGINE=InnoDB;
ALTER TABLE task_type_info ENGINE=InnoDB;

4. 数据不一致问题

检查方法

-- 查找外键表中有但主键表中没有的值
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. 表不存在或列名错误

检查方法

-- 确认表和列是否存在
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');

以上就是MySQL错误1005(errno: 150)的原因分析与解决方案的详细内容,更多关于MySQL错误1005(errno: 150)的资料请关注脚本之家其它相关文章!

相关文章

  • MYSQL大表加索引的实现

    MYSQL大表加索引的实现

    本文主要介绍了MYSQL大表加索引的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • centos7利用yum安装mysql 8.0.12

    centos7利用yum安装mysql 8.0.12

    这篇文章主要为大家详细介绍了centos7利用yum安装mysql 8.0.12,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • 使用Canal实现MySQL数据同步的完整指南

    使用Canal实现MySQL数据同步的完整指南

    Canal 是阿里巴巴开源的一个基于 MySQL 数据库增量日志(binlog)解析的组件,本文主要介绍了如何使用Canal实现MySQL数据同步功能,希望对大家有所帮助
    2025-06-06
  • MySQL高性能实现Canal数据同步神器

    MySQL高性能实现Canal数据同步神器

    本文主要介绍了MySQL高性能实现Canal数据同步神器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 一文带你将csv文件导入到mysql数据库(亲测有效)

    一文带你将csv文件导入到mysql数据库(亲测有效)

    一直不大懂csv怎么通过mysql图形化的界面直接导入,看了很多帖,才觉得自己会了,下面这篇文章主要给大家介绍了关于将csv文件导入到mysql数据库的相关资料,需要的朋友可以参考下
    2022-08-08
  • Mysql日志文件和日志类型介绍

    Mysql日志文件和日志类型介绍

    这篇文章主要介绍了Mysql日志文件和日志类型介绍,本文讲解了日志文件类型、错误日志、通用查询日志、慢速查询日志、二进制日志等内容,需要的朋友可以参考下
    2014-12-12
  • MySQL5.7中 performance和sys schema中的监控参数解释(推荐)

    MySQL5.7中 performance和sys schema中的监控参数解释(推荐)

    在MySQL5.7中,performance schema有很大改进,包括引入大量新加入的监控项、降低占用空间和负载,以及通过新的sys schema机制显著提升易用性。下面通过本文给大家介绍 MySQL5.7中 performance和sys schema中的监控参数解释,需要的朋友可以参考下
    2017-08-08
  • MySQL中INSERT+SELECT的使用方式

    MySQL中INSERT+SELECT的使用方式

    MySQL的INSERT INTO SELECT FROM语句允许用户通过一条SQL语句实现从一个或多个表中查询数据并将结果插入到另一个表中,这种方式特别适用于需要将数据从一张表迁移到另一张表,或者基于多表查询结果创建新表的场景
    2024-10-10
  • MySQL中CONCAT()函数出现值为空的问题及解决办法

    MySQL中CONCAT()函数出现值为空的问题及解决办法

    项目中查询用到了concat()拼接函数,本文主要介绍了MySQL中CONCAT()函数出现值为空的问题及解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • MySQL中B树索引和B+树索引的区别详解

    MySQL中B树索引和B+树索引的区别详解

    这篇文章主要为大家详细介绍了MySQL中B树索引和B+树索引的区别,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03

最新评论