Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当删除1对1表中的相应行时,如何自动删除表中的行?_Php_Mysql_Cascading Deletes - Fatal编程技术网

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

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 我正在寻找一种优雅的方式,在

我有两种不同的文件。一个是按文件夹组织的。另一种是由客户组织的。以下是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中的行将被删除,但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分钟运行一次查询