报错原因1: 主键与外键的字符类型不匹配

首先创建两张如下的表然后执行,发现two表创建失败,检查之后分析原因得出是因为主键与外键的字符类型不匹配,one表的id是int类型,two表的tid是char(10)类型,这时只要改为一致的字符类型就解决问题了。
如果发现自己创建的表,主键外键字符类型一样,那就考虑其它可能,请接着看。

create table one(
    id int primary key,
    oname VARCHAR(30)
);
create table two(
    tid char(10),
    tname VARCHAR(30),
    constraint t_o_sk foreign key (tid) references one(id) on delete cascade on update cascade  
##on delete cascade是级联删除,on update cascade 是级联更新
);

报错原因2:主表的主键不是primary key
如果是的话,表又创建好了,那么可以用alter进行修改即可。
这种问题发现没有解决问题的话,那可能下面的考虑第三种情况了。

alter table one modify id  int primary key;

报错原因3:检查字符编码是否一致
Mysql创建外键时报errno150,Can't create table错误

报错原因4:找不到外键引用的列
列在增加外键的时候,可能已经存在数据了(历史数据,或者更新数据库表时设置的默认值),但这些数据并不一定能在外键关联表中找到对应的行记录。这种情况也会导致外键创建失败。