今天使用phpmyadmin关联外键的时候一直报错
#1452 - Cannot add or update a child row: a foreign key constraint fails......
弄了半天 终于解决了这个问题 以下就是几点需要注意的地方
首先:要知道
在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束。
外键的使用条件:
1.两个表必须是 InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);
2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;
3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以
其次:去实践
由于表中已经有了数据,需要关联的字段可能会因为数据的不一致而导致关联失败。
1.首先看看两个表是不是一样的字段,如果不是,改成一样的字段,字段名可以不一样,但是字段类型必须一样,如果是,就看看两个表中这个字段中的数据是否一一对应。
2.在linux的终端里进入mysql,进去后使用
select * from 表1 where 表1中的字段 not in (select 表2中的字段 from 表2);
如果有结果,在phpmyadmin中删除这些结果。
如果没有结果,将这个语句反过来用一下,即:
select * from 表2 where 表2中的字段 not in (select 表1中的字段 from 表1);
如果有结果,删除之,如果没有结果,继续。
3.在phpmyadmin中找到想要关联外键的那个表,点击下边的索引,看看你的索引有没有什么问题,重复的无效的等等,解决之后继续。
4.在phpmyadmin中找到想要关联外键的那个表,点击下边的查看关系,找到你想要的字段,点击旁边的下拉框,然后正常按程序走,最后执行就完事了。
最后:总结
解决这个问题用了2个多小时,总是失败,不知道什么原因,还好没有激动一下把数据都删掉,建议在建表之前就想好关系,在建表的时候就把关系直接添加上,没有数据还是很容易添加的。
最最后:提醒
两个表一定要都是InnoDB类型的,MYISAM是不好用的,想知道为啥,去google。
以上