我正在编写一些脚本,以编程方式自动执行数据库迁移,在一个我没有设计、拥有或维护的系统中进行的一系列折衷工作结束时,我需要将一些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中使用的语言,但我很高兴找到需要其他语言的解决方案。

最佳答案

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)

10-07 19:04
查看更多