我们不支持InnoDB数据库。因此,在从5.0迁移到MySQL 5.5之前,我希望将所有InnoDB表更改为MyISAM,但很多都有外键约束。
因此我想在执行(def app (noir.util.middleware/app-handler
[your-routes]
:formats [:json-kw]))
的会话级别禁用它,但外键仍然会出现相同的错误。
set foreign_key_checks=0
令人惊讶的:
mysql> SET foreign_key_checks = 0;
Query OK, 0 rows affected (0.00 sec)
mysql> use sn;
Database changed
mysql> alter table facility engine='MyISAM';
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
MySQL 5.0 documentation显示变量确实存在。
mysql> SHOW Variables WHERE Variable_name='foreign_key_checks';
Empty set (0.00 sec)
mysql> SET foreign_key_checks = 0;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW Variables WHERE Variable_name='foreign_key_checks';
Empty set (0.00 sec)
答案 0 :(得分:2)
正如foreign key constraint上的MySQL文档所述(突出显示是我的):
此外,如果表具有外键约束,则不能使用ALTER TABLE来更改表以使用其他存储引擎。 要更改存储引擎,必须先删除所有外键约束。
文档来自v5.5,但我认为这个限制也适用于v5.0。
更新
是的,我在Oracle网站上找到了v5.0手册,relevant section也说了同样的话:
此外,如果InnoDB表具有外键约束,则ALTER TABLE不能用于更改表以使用其他存储引擎。要更改存储引擎,必须先删除任何外键约束。