mysql foreign key incompatible

  

报错:

 

 

 

  1. 置foreign_key_checks变量为0
    set @@session.foreign_key_checks=0
    select @@session.foreign_key_checks;

     

  2. 比对两张表
    show full columns from dept_emp;
    show full columns from departments;

     

     可以看到两张表关联的字段dept_no collation不相同

  3. 查看库和表定义
    show create database uranus;
    show create table dept_emp;
    show create table departments;

     

     

     

  4. 查看外键引用关系
    select * from information_schema.key_column_usage where referenced_table_name='departments'\G

     

    当更改表名的时候foreign key产生约束,foreign_key_checks变量不起作用

     

  5. 将库 & 表 采用utf8mb4字符集,collation 为 utf8mb4_general_ci
    alter database uranus default character set utf8mb4 collate utf8mb4_general_ci;

     


    修改表默认charset & collation

    alter table dept_emp default character set utf8mb4 collate utf8mb4_general_ci;

    修改字段 charset & collation

    alter table dept_emp modify dept_no char(4) character set utf8mb4 collate utf8mb4_general_ci;
    alter table dept_emp change dept_no dept_no char(4) character set utf8mb4 collate utf8mb4_general_ci;

    同时修改 表 和所有字段 charset & collation

    alter table dept_emp convert to character set utf8mb4 collate utf8mb4_general_ci;

     

  6. 修改完后两张表的字段dept_no定义完全相同,错误解决

    rename table departments_copy to departments;

     

  7.  

    所有的key都存于information_schema.key_column_usage表中

    describe information_schema.key_column_usage;

     

     

    CONSTRAINT_CATALOG: constraint 所属目录名称,值始终为def
    schema <=> database
    外键有下面几种关系:

    CASCADE:
         主表update/delete, 级联子表update/delete
    SET NULL: 

            主表update/delete,子表foreign key字段置null(foreign key不能为not null)
    NO ACTION:

            禁止主表update/delete
    RESTRICT:

                      禁止主表update/delete
        
posted @ 2020-11-21 14:14  ascertain  阅读(363)  评论(0编辑  收藏  举报