mysql 建表_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;
a1da112773f0a5f532e3941d873d3988.png

思路:

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

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';
1940984fddd32d5feeac9f08783b9951.png

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


2、查看act_re_model表

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

a91a03299a79733ab27e0022dae19f34.png

3、根本原因

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


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

844a8745a60dfb8218b75a806eeeac92.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值