这是一个与ON DELETE CASCADE not working in MySQL问题相同的问题,其中My-ISAM引擎没有执行其ON DELETE CASCADE部分。但问题是我必须使用MyISAM表类型而不是InnoDB
如果我的父表中有一行被删除,我怎么能确保我可以模拟ON DELETE CASCADE,以便在它引用它的许多其他表中更新它。我可以写一些触发器吗?
答案 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 表中的 ti 表,并修复 tm 上的差异表格,如果有的话。
tm 只包含要包含在FTI中的TEXT和对 ti 表的引用。