【问题标题】:Why is the ON DELETE CASCADE not working & How to delete left over references为什么 ON DELETE CASCADE 不起作用以及如何删除剩余的引用
【发布时间】:2011-08-14 05:22:03
【问题描述】:

这是一个与 ON DELETE CASCADE not working in MySQL 问题相同的问题,其中 My-ISAM 引擎没有执行其 ON DELETE CASCADE 部分。但问题是我必须使用 MyISAM 表类型本身而不是 InnoDB

当我的父表中的一行被删除时,我如何确保我可以模拟 ON DELETE CASCADE,以便它在引用它的许多其他表中更新。?我可以写某种触发器吗?

【问题讨论】:

  • 不能将表迁移到 InnoDB 吗?
  • 文本搜索对我来说很重要,因此我不能使用 InnoDB

标签: mysql database-design


【解决方案1】:

来自fine manual

对于其他存储引擎,MySQL Server 会解析并忽略外键规范。

因此,如果您同时需要 ON DELETE CASCADE 行为和 MyISAM 表,那么您必须使用 DELETE 触发器或数据库外部类似的东西手动执行 CASCADE 部分。添加这样的触发器应该可以工作:

create trigger fake_cascade_delete after delete on table_name
for each row begin
    delete from other_table
    where referencing_column = OLD.id;
end;

这只是我的想法,表和列名当然只是为了演示目的。

【讨论】:

  • 这甚至包括ON UPDATE CASCADE?
  • 所有基于外键的操作都不适用于 MyISAM 表。
  • @footy:“对于其他存储引擎,MySQL Server 会解析并忽略外键规范。”服务器会解析它们然后完全忽略它们,它们没有任何作用。
  • 我正在对大型表(50 万行)进行大量读取操作,而写入操作非常仅限于服务器端管理员修改。我选择 MyIsam 是否正确?即使我必须模拟ON DELETE 操作。
  • @footy:如果您需要全文索引,那么您必须使用 MyISAM。如果您可以将全文内容移到其他地方,您会想要对 MyISAM 和 InnoDB 进行基准测试,看看哪个效果最好。您也可以查看 PostgreSQL,但我不熟悉 PostgreSQL 的全文搜索扩展,因此无法对此发表评论。
【解决方案2】:

有很多方法可以实现类似外键的行为,通过更多的编码、信号量、触发器等......

但是这些解决方案不如保证表完整性的 InnoDB 外键实现可靠。
这意味着如果由于某种原因不会执行级联,则也不会考虑初始删除。

您可以在执行DELETE 之前锁定表,但在主表上有效执行 DELETE 而级联仿真不是(出于某种原因)的概率仍然不为零。

表重复伪解:

根据您的需要,如果您确实需要 MyISAM for FTI,您可以执行以下操作(如果空间不是问题)

  • 有两个表,titmi 用于 Innodb,m 用于 MyIsam),李>
  • 根据您的数据库拓扑,如有必要,还可以复制一些子表(这也需要 FTI)
  • 首先在事务中对 ti(和子级)执行所有更新
  • 然后执行 tm(和子项,如果有的话)更新,以便在 tm 上更新 FTI

这样至少您有一个包含可靠数据的参考表ti(和子表)。
然后,您可以(可能每天一次)检查 ti 表与 tm 表并修复 tm 上的差异表(如果有)。

tm 将只包含要包含在 FTI 中的 TEXT 和对 ti 表的引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 2011-07-15
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多