【问题标题】:Help me save my database帮我保存我的数据库
【发布时间】:2011-02-28 05:02:58
【问题描述】:

我最近将我的数据库迁移到了不同​​的服务器。

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

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

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

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

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

我的问题是这样的:

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

提前感谢您的帮助

【问题讨论】:

  • 使用“SET foreign_key_checks = 0”并尝试将表移动到innoDB。我没有尝试过,但看看它是否有效。在做任何事情之前先备份..

标签: mysql innodb cascading-deletes


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 2016-05-29
    相关资源
    最近更新 更多