详解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;
思路:
产生这个错误的多数原因有以下几点:
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方面的内容,感兴趣的朋友可以关注下~
相关推荐
CoderToy 2020-11-16
bianruifeng 2020-11-16
云中舞步 2020-11-12
敏敏张 2020-11-11
暗夜之城 2020-11-11
好记忆也需烂 2020-11-11
Coder技术文摘 2020-09-29
huacuilaifa 2020-10-29
Gexrior 2020-10-22
lpfvip00 2020-10-07
云中舞步 2020-09-11
康慧欣 2020-09-10
silencehgt 2020-09-07
幸福ITman汪文威 2020-09-05
sofia 2020-09-03
nan00zzu 2020-08-19
CHINA华军 2020-08-18
cyhgogogo 2020-08-18