总得来说是因为两个表的字段类型不一致,例如:
- 两个字段的类型或大小不严格匹配,一个为tinyint,另一个为char;或一个为int(10)另一个为int(9)也是不行的,即使都为int(10),但一个是有符号数,一个是无符号数也会报错。
- reference的另一个表的字段必须是主键或建立索引。
- 外键的名字有重复或与键值重复。
- 两个表必须都是用InnoDB引擎,事实上MyISAM引擎是不会产生外键的。
- 设置了ON DELETE SET NULL,但字段又设置为NOT NULL。
- 在这个关系里面,其中的一个字段是一个混合键值中的一个,它没有自己独立的索引,这时,你必须为它创建一个独立的索引。
- 主键和外键的字符编码不一致。例如一个是utf-8另一个是GBK。
总的来说,就是两个字段有不一样的地方,不能建立外键约束。