【问题标题】:Converting to MyISAM, `foreign_key_checks = 0` Not Working转换为 MyISAM,`foreign_key_checks = 0` 不工作
【发布时间】:2014-09-04 19:34:17
【问题描述】:

我正在编写一些脚本来以编程方式自动化数据库迁移,并且在我没有设计、拥有或维护的系统中工作的一系列折衷方案结束时,我需要转换一些 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

无论我在全局或会话级别设置密钥检查,都会发生这种情况。我认为这里的问题是问题中的表有 other InnoDB 表引用它,并且 MySQL 拒绝最终处于 InnoDB 表引用不是 InnoDB 的表的状态。 (我可能对此有误,很高兴得到纠正)

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

如果答案是“接受并完成工作”,我很高兴从专家那里听到这句话——我只是不想在不需要的时候浪费时间。

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

【问题讨论】:

标签: php mysql sql innodb myisam


【解决方案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)

【讨论】:

  • +1 以获得良好信息——但这里涉及大量表——我希望有一个命令可以为我完成所有这些工作。
  • @AlanStorm Ahh 不确定,是否存在这样的命令。为什么要转换为 MyISAM?您将失去一些异常保护,这是由外键保证的。
  • 同意,但请参阅“在我没有设计、拥有或维护的系统中工作的一系列妥协的结束”
  • @AlanStorm 这里讨论过:stackoverflow.com/questions/14546477/… - 你可以使用系统表
猜你喜欢
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 2010-12-25
  • 2016-06-14
相关资源
最近更新 更多