Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL错误1005(errno: 150)

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

作者: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;

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)的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文