帮我保存我的数据库

时间:2011-02-28 05:02:58

标签: mysql innodb cascading-deletes

我最近将我的数据库迁移到了另一台服务器。

在旧服务器上,我大量使用了InnoDB的ON DELETE CASCADE规则。

在新服务器上,MySql没有设置InnoDB引擎。

在迁移时,新服务器已默认为MyISAM - 直到现在我才注意到这一点。 (敲头撞墙!)

因此,情况如下:由于数据库已被使用,我的一些使用ON DELETE CASCADE规则的表现在不同步。 (仍然撞在墙上。)

这意味着我不能只将表更改为InnoDB并重新应用级联规则 - 现在一些键引用不再存在的行。

我的问题是:

有没有办法配置INSERT语句,以便在插入的任何行违反级联规则时,它只是默默地忽略该行并移动到下一行? (起初我以为INSERT IGNORE会完成这个,但我已经尝试过了,它似乎没有用。)

提前感谢您的帮助

1 个答案:

答案 0 :(得分:0)

第1步

进行备份

第2步

SET foreign_key_checks = 0;

Migrate your data

SET foreign_key_checks = 1;

第3步

DELETE FROM table WHERE id NOT IN (SELECT foreign_key_id FROM table2);

删除语句与ON DELETE CASCADE规则匹配的位置 请记住,删除的顺序很重要,因此如果需要,请计划并进行额外备份。

再次完成备份并编辑备份SQL语句,以使行SET foreign_key_checks = x 存在。 如果使用外键检查启用的备份有效,那么您将重新开始营业。

我确信你可以在没有IN的情况下找出更有效的删除查询,只需要我的2美分