如何在phpMyAdmin中规避InnoDB转MyISAM时的#1217外键错误
解决InnoDB表转MyISAM引擎时的外键约束问题
出现#1217 - Cannot delete or update a parent row: a foreign key constraint fails错误,是因为cache表作为父表被其他子表通过外键引用,直接修改引擎会触发外键约束。即使执行SET FOREIGN_KEY_CHECKS=0无效,大概率是命令不在同一个会话执行,或是未处理关联的子表。按以下步骤操作:
第一步:找出所有关联子表
执行以下SQL查询,获取所有引用cache表的子表及外键信息:SELECT TABLE_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = 'cache' AND REFERENCED_TABLE_SCHEMA = '你的数据库名';替换
你的数据库名为实际数据库名称,结果里的TABLE_NAME就是依赖cache的子表,CONSTRAINT_NAME是外键名称。第二步:在同一会话中批量执行修改
SET FOREIGN_KEY_CHECKS=0仅对当前会话生效,必须将所有命令放在同一个执行块中:SET FOREIGN_KEY_CHECKS=0; -- 先修改所有关联子表的引擎为MyISAM(MyISAM不支持外键,修改后外键会自动移除) ALTER TABLE 子表1 ENGINE=MyISAM; ALTER TABLE 子表2 ENGINE=MyISAM; -- 再修改cache表引擎 ALTER TABLE cache ENGINE=MyISAM; SET FOREIGN_KEY_CHECKS=1;替换
子表1、子表2为第一步查询到的实际子表名称。第三步:手动删除外键(备选方案)
如果上述方法仍无效,先手动删除子表的外键约束,再修改引擎:-- 删除子表的外键 ALTER TABLE 子表1 DROP FOREIGN KEY 外键名称1; ALTER TABLE 子表2 DROP FOREIGN KEY 外键名称2; -- 修改所有表引擎 ALTER TABLE cache ENGINE=MyISAM; ALTER TABLE 子表1 ENGINE=MyISAM; ALTER TABLE 子表2 ENGINE=MyISAM;
注意:MyISAM不支持外键、事务、行级锁等InnoDB特性,转换前请确认业务场景可以接受这些特性的丢失。
内容的提问来源于stack exchange,提问作者creators
相关产品推荐
相关产品推荐

