Php 当删除1对1表中的相应行时,如何自动删除表中的行?
我有两种不同的文件。一个是按文件夹组织的。另一种是由客户组织的。以下是mysql中的表结构:Php 当删除1对1表中的相应行时,如何自动删除表中的行?,php,mysql,cascading-deletes,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 我正在寻找一种优雅的方式,在
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中的行将被删除,但docs中相应的行将保留。)
是否可以在mysql中使用cascade规则或其他方法进行设置,以便通过cascade删除folderDocs或clientDocs中的一行时,也会删除docs中相应的行?(我希望避免先通过编程删除文档,然后再删除文件夹/客户端。)
(提前)感谢您的帮助。我认为您不能直接用sql完成这项工作。您可能需要编写一个存储过程来执行此操作 但这是个好主意吗。因为你的桌子的设计方式让它看起来像一个多对多的关系。如果还有其他文件夹中对文档的引用,是否可以删除该文档 如果假设它们是一对多关系,那么文件夹和客户端的外键应该在doc中,而不是表本身。然后可以使用级联删除 编辑:您可以尝试改用触发器
但是它仍然需要编写一些代码(以触发器的形式)假设每个文档必须属于一个文件夹或客户端,那么您可能需要设置一个计划的清理作业,使用下面的查询删除所有没有文件夹和客户端的文档
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)
这可能是一个愚蠢的问题,但您的表中是否将
docID
设置为外键?因为你想要的东西听起来和删除级联上的完全一样,但是除非你设置了外键,否则它不会起作用。为什么不使用删除触发器?@Rogier-我认为如果通过级联删除,删除触发器就不起作用。如果我错了,请纠正我。我也不确定。但是我认为您可以删除级联删除并在每个表上实现触发器。那么is应该没有问题,应该可以正常工作。谢谢,docs和folderDocs以及docs和clientDocs之间的关系是1:1。这样就可以了。但现在的问题是,每次查询出文档时,您还需要查询出文件夹和客户端,以查看它们是否仍然有效。您可以将此代码添加到clientDocs和folderDocs表上的afterDelete触发器中,以便在每次删除文档时执行该代码,或者从cron作业每隔5分钟运行一次查询