龙空技术网

mysql数据库建表提示Failed to add the foreign key constraint

波波说运维 157

前言:

现在小伙伴们对“mysql在建表时添加外键约束”可能比较关切,小伙伴们都需要剖析一些“mysql在建表时添加外键约束”的相关文章。那么小编在网摘上收集了一些关于“mysql在建表时添加外键约束””的相关知识,希望咱们能喜欢,我们快快来了解一下吧!

概述

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

奇怪现象

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;
思路:

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

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';

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

2、查看act_re_model表

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

3、根本原因

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

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

标签: #mysql在建表时添加外键约束