这个错误是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_name和robot_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');`