为什么ON DELETE CASCADE不工作&如何删除遗留引用

时间:2011-08-14 05:22:03

标签: mysql database-design

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

如果我的父表中有一行被删除,我怎么能确保我可以模拟ON DELETE CASCADE,以便在它引用它的许多其他表中更新它。我可以写一些触发器吗?

2 个答案:

答案 0 :(得分:4)

来自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;

这只是我的头脑,桌面和列名称当然只是为了演示目的。

答案 1 :(得分:2)

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

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

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

表复制伪解决方案:

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

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

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

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