详解mysql常见报错之Failed to add the foreign key constraint

概述

今天在创建某张表的时候,表中的定义是没有外键定义的,但是却提示无法添加外键约束?这种是什么情况呢?下面一起来看看吧~


奇怪现象

CREATE TABLE `ycapp_uat`.`act_re_deployment` (
 `ID_` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
 `NAME_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
 `CATEGORY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
 `KEY_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
 `TENANT_ID_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '',
 `DEPLOY_TIME_` timestamp(0) NULL DEFAULT NULL,
 `ENGINE_VERSION_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
 PRIMARY KEY (`ID_`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

详解mysql常见报错之Failed to add the foreign key constraint


思路:

产生这个错误的多数原因有以下几点:

1、两张表里要设主键和外键的字段的数据类型或者数据长度不一样 (例如这个是int 另外一个是tinyint,或者都是int,但是设置的长度不同)

2、某个表里已经有记录了

3、两个表的引擎不一样

--查看表的引擎语句
show table status from 数据库名 where name='表名';

4、要设置外键的字段不能为主键

5、改建所参考的字段必须为主键

6、两个字段必须具有相同的数据类型和约束


解决过程:

1、查看外键关系

SELECT
 TABLE_SCHEMA,
 TABLE_NAME,
 COLUMN_NAME,
 REFERENCED_TABLE_SCHEMA,
 REFERENCED_TABLE_NAME,
 REFERENCED_COLUMN_NAME,
 CONSTRAINT_NAME 
FROM
 INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE
 CONSTRAINT_SCHEMA = 'ycapp_uat' 
 AND REFERENCED_TABLE_NAME = 'act_re_deployment';

详解mysql常见报错之Failed to add the foreign key constraint

可以发现act_re_model的外键列deployment_id_关联act_re_deployment的主键列ID_


2、查看act_re_model表

可以发现act_re_model表已经有数据了,但act_re_deployment都没创建,那就是没数据,违反了外键约束

详解mysql常见报错之Failed to add the foreign key constraint


3、根本原因

在跟测试沟通后发现是sit库(utf8)同步到UAT库(utf8mb4编码),而同步的脚本是先drop表再建表,drop表是成功了,但是创建表的时候由于编码不一致,即主键和外键的字段的数据长度不一样 ,导致无法创建表,也就有了上述奇怪的现象:某张表存在外键约束,但是主表却不在了(因为正常情况下主表不在,是没法创建外键约束的)


觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

详解mysql常见报错之Failed to add the foreign key constraint

相关推荐