转换为MyISAM,`foreign_key_checks = 0`不工作

时间:2014-07-14 19:15:46

标签: php mysql sql innodb myisam

我正在编写一些脚本来以编程方式自动化数据库迁移,并且在我没有设计,拥有或维护的系统中进行的一系列妥协结束时,我需要转换一些MySQL InnoDB表到MyISAM表。但是,当我尝试更改表时

mysql> ALTER TABLE catalog_category_entity ENGINE=MyISAM;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
mysql>

MySQL抱怨。这是预料之中的。但是,如果我禁用foreign_key_checks,我会得到相同的结果

mysql> SET foreign_key_checks = 0;
mysql> ALTER TABLE catalog_category_entity ENGINE=MyISAM;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

无论我在全局或会话级别设置密钥检查,都会发生这种情况。我假设这里的问题是问题中的表有其他 InnoDB表引用它,并且MySQL拒绝最终处于InnoDB表引用不是InnoDB的表的状态。 (我可能在这方面不正确,我很乐意纠正)

有没有快速处理这种情况的方法?我基本上希望数据库中的所有表都是MyISAM,并且自己追踪所有关系和/或手动删除约束似乎非常耗时,而且计算机会更好。

如果答案是“吮吸并完成工作”,我很高兴听到专家的意见 - 如果我不需要,我只是不想浪费时间。

如果我在PHP编程的语言很重要,但我很高兴能找到需要其他语言的解决方案。

1 个答案:

答案 0 :(得分:1)

MyISAM不支持外键。在更改引擎之前删除密钥:

> ALTER TABLE catalog_category_entity DROP FOREIGN KEY fk_name;
> ALTER TABLE catalog_category_entity ENGINE=MyISAM;

您可以通过以下方式找到外键名称:

> SHOW CREATE TABLE catalog_category_entity;

这可能会有所帮助:Delete all foreign keys in database(MySql)