Mysql5.7->8.0导数据报错 Referencing column ‘def_id’ and referenced column ‘id’ in foreign key constraint ‘id_id’ are incompatible
在导数据的时候发现报错,导致其中两张表无法导入
** (myloader: 121427): CRITICAL **: 16:54:10.845: Error restoring workflow.act_ru_task from file workflow.act_ru_task-schema.sql: Referencing column TASK ID • and referenced column ID • in foreign key constraint
*ACT FK TSKASS TASK are incompatible.
** (myloader: 121427): CRITICAL **: 16:54:11.193: Error restoring workflow.act_re_procdef from file workflow.act_re_procdef.00000.sql: Table workflow.act_re_procdef doesn't exist
以上报错其实已经给了提示,当时没看懂
一、最先想法
set forigen_key_checks=0;
show variables like 'foreign_key_checks';
首先想到的是外键检查导致的报错,然后把目标库禁用外键检查,但是当时的目标库此参数已经是禁用的
二、处理办法
以下是我摸索的处理思路,实际上完全不用这么复杂。
1、找到是两个外键约束导致的报错
select * from information_schema.table_constraints where constraint_name in ('id_id');
这张视图里记录了所有的约束信息
2、手动删除外键,导入报错的表
alter table t5 drop foreign key t1_t1;
source /tmp/t5.sql
3、恢复外键(报错)
1.查看创建表的sql
show create table t5
2.添加外键
alter table t5 add constraint id_id foreign key (def_id) references t4 (id);
Referencing column 'def_id' and referenced column 'id' in foreign key constraint 'id_id' are incompatible.
仔细看会发现这个报错和一开始导入数据时候的报错差不多
4、解决报错
根据报错可以知道报错是由于父表的主键列的数据类型和子表的数据类型不一致,只有数据类型一致,才能创建外键约束
当时只看了最后面的表级的字符集类型和排序,没有看具体这两列的差别,导致怎么也找不到原因
- 父表
- 子表
将子表的字符集类型修改和父表一致
alter table t5 modify column def_id varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
扫描二维码关注公众号,回复:
16688621 查看本文章
创建外键约束
alter table t5 add constraint id_id foreign key (def_id) references t4 (id);