删除1对1表中相应行时如何自动删除表中的行?

时间:2012-03-06 00:47:08

标签: php mysql cascading-deletes

我有两种不同的文件。一个是按文件夹组织的。另一个是由客户组织的。这是mysql中的表结构:

Table docs
ID
title

Table folderDocs
docID -> docs(ID)
folderID -> folders(ID) ON DELETE CASCADE

Table clientDocs
docID -> docs(ID)
clientID -> clients(ID) ON DELETE CASCADE

我正在寻找一种删除文件夹或客户端时自动删除文档的优雅方法。上述级联规则并没有完全实现这一点。 (即folderDocs中的行将被删除,但文档中的相应行将保留。)

无论如何使用级联规则或其他方法在mysql中设置它,以便当通过级联删除来自folderDocs或clientDocs的行时,文档中的相应行也会被删除? (我希望避免首先以编程方式删除文档,然后删除文件夹/客户端。)

先谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

我认为你不能在直接的SQL中做到这一点。您可能需要编写存储过程来执行此操作。

但这是个好主意。你的表的设计方式使它看起来像一个多对多的关系。如果仍然从另一个文件夹中引用文档,你可以删除文档吗?

如果它们被认为是一对多的关系,则文件夹和客户端的外键应该在doc中,而不是表格本身。然后你可以使用级联删除。

编辑:您可以尝试使用触发器。 http://dev.mysql.com/doc/refman/5.0/en/triggers.html

但它仍然需要写一些代码(以触发器的形式)

答案 1 :(得分:0)

假设每个文档必须属于文件夹或客户端,那么您可能希望设置一个计划清理作业,以使用下面的查询删除所有没有文件夹和客户端的文档

DELETE FROM docs USING docs
LEFT JOIN clientDocs c ON (c.docid = docs.id) 
LEFT JOIN folderDocs f ON (f.docid = docs.id) 
WHERE ISNULL(c.clientid) AND ISNULL(f.folderid)