1

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

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

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

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

所以,情况是这样的:因为数据库一直在使用,我的一些使用 ON DELETE CASCADE 规则的表现在不同步了。(仍然用头撞墙。)

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

我的问题是这样的:

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

在此先感谢您的帮助

4

1 回答 1

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 美分

于 2011-04-15T18:22:59.173 回答