同时级联删除数据表和搜索表

时间:2012-05-15 06:55:49

标签: mysql innodb myisam

我正在存储目录和文件的文件系统层次结构。

在innodb表中,我存储每个目录/文件的详细信息,并使用将在删除时级联的外键约束维护父子关系。

myisam表用于通过全文搜索来搜索这些目录/文件。它包含每行的名称和ID。

数据表(innodb表)中的任何行都将在搜索表(myisam表)中具有相应的行,并且在数据表中添加或删除行必须反映在搜索表中。

我正在尝试找到最佳解决方案,以便在删除父目录时保持两个表之间的数据一致性。 innodb表很好。我删除了父项,删除级联通过子项直到它们都被删除。从myisam表中删除相应的行更加困难。

我的第一个想法是在innodb表上使用on-delete触发器。删除行时,它会从myisam表中删除相应的行。但是,由于MySQL在级联删除期间没有激活触发器(7年的已知错误,通过提及手册中缺少支持而修复),这不是一种选择。

我的第二个想法是在搜索表中放置了一个父子关系,但它是一个支持全文搜索功能的myisam表,因此它不支持外键约束。

我听说innodb现在支持全文搜索,所以我想也许我可以更改搜索表引擎,但它只能在实验室版本中使用。

我最后的想法是放弃外键约束并仅使用触发器来维护数据一致性。在删除时,从innodb和myisam表中删除parent = OLD.id.但是,为了防止可能破坏表中所有数据的无限循环,MySQL不支持在激活触发器的同一个表中操作数据。

我已经通过循环请求以编程方式检索父目录下的所有子项,但是,我觉得必须有更好的选择。 还有其他方法可以提高效率吗?此时,我能想到的唯一两个选项是等待上述方法之一被修复或更改为不同的RDBMS,如PostgreSQL这确实支持级联删除的触发触发器。

非常感谢任何其他想法。

1 个答案:

答案 0 :(得分:1)

这种令人头疼的问题正是让我在可能的情况下离开mysql的原因。

  

......我觉得必须有更好的选择...

可悲的是没有。简单的问题是你不能删除级联并让mysql知道它刚刚删除了什么。因此,您唯一的选择是在它之前找出它要删除的内容(这是您最后建议的算法)。

由于级联会破坏您的数据,因此您不应使用on update cascade密钥,以便在不删除子级的情况下尝试删除父目录将失败。

我建议你创建一个程序来为你做繁重的工作(删除)。这将防止您的应用程序和数据库之间的大型IO,因为它通过所有目录回避。如果您通过不同的应用程序访问同一个数据库(或者您只是想手动执行某些操作),我也会提供这样做的通用代码。

正如我先说的那样,我现在大多使用postgresql。这是原因的一个例子。