先插子表后补父表主键,InnoDB外键关联是否正常且高效?
关于InnoDB临时关闭外键检查后的数据关联问题
嘿,针对你在MySQL 5.5 + InnoDB下遇到的这个场景——关闭foreign_key_checks先插子表B(带父表A未存在的主键值),再补插父表A对应主键行,我来逐个解答你的疑问:
1. 外键与主键的关联是否正常生效?
完全没问题!当你补插入父表A的主键行后,只要foreign_key_checks恢复为默认的1(不管是重启会话还是手动执行SET foreign_key_checks = 1),外键约束就会正常生效。后续如果尝试删除父表的该行、或者修改子表的外键值为不存在的主键,都会被InnoDB的外键约束拦截,和常规流程下的约束表现完全一致。
简单说,你只是临时跳过了插入子表时的约束检查,并没有破坏外键本身的关联逻辑,等父表数据补全后,关联就自动合法且生效了。
2. 性能是否与常规情况一致?
是的,性能不会有任何差异。InnoDB的外键约束依赖父表的主键索引和子表的外键索引(如果你给子表外键列建了索引的话,这也是最佳实践),当父表主键行补全后,这些索引的工作状态和常规插入流程完全一样。不管是关联查询、后续的约束检查操作,性能都和正常创建外键后按顺序插入数据的情况一致,不会留下任何性能隐患。
3. 是否需要删除并重建外键?
完全没必要!外键约束本身没有损坏,你只是临时绕过了插入阶段的检查而已。现在父表的主键已经和子表的外键值匹配,整个数据关系符合外键规则,外键会正常履行它的职责,不需要做任何重建操作。
最后还是要啰嗦一句:虽然你知道这是不良实践,但还是要提醒,这种操作很容易因为疏忽导致数据不一致(比如漏插父表数据、插错主键值),后续排查起来会很头疼,尽量还是遵循先父表后子表的插入顺序哦。
内容的提问来源于stack exchange,提问作者Linus
相关产品推荐
相关产品推荐

