我最近将我的数据库迁移到了另一台服务器。
在旧服务器上,我大量使用了InnoDB的ON DELETE CASCADE规则。
在新服务器上,MySql没有设置InnoDB引擎。
在迁移时,新服务器已默认为MyISAM - 直到现在我才注意到这一点。 (敲头撞墙!)
因此,情况如下:由于数据库已被使用,我的一些使用ON DELETE CASCADE规则的表现在不同步。 (仍然撞在墙上。)
这意味着我不能只将表更改为InnoDB并重新应用级联规则 - 现在一些键引用不再存在的行。
我的问题是:
有没有办法配置INSERT语句,以便在插入的任何行违反级联规则时,它只是默默地忽略该行并移动到下一行? (起初我以为INSERT IGNORE会完成这个,但我已经尝试过了,它似乎没有用。)
提前感谢您的帮助
答案 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美分