Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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 使用一条SQL语句删除两个表中的数据_Php_Mysql_Sql - Fatal编程技术网

Php 使用一条SQL语句删除两个表中的数据

Php 使用一条SQL语句删除两个表中的数据,php,mysql,sql,Php,Mysql,Sql,嗨,Stackoverflow用户 我在使用外键删除两个表中的数据时遇到问题 简介:我创建了一个博客网站,用xampp在本地托管,用PHP和MySQL编写。基本上我已经完成了它的功能,但这不是我来这里的原因。我一次从两个表中删除数据时遇到问题 场景: 我的部分数据库的结构如下图所示 假设一个用户为他的网站创建了一篇帖子,帖子存储在blog_条目表中,用户名从user_table引用,并为该帖子生成一个唯一的条目id 我创建了一个单独的表,用于存储添加到名为entry\u comments的特定

嗨,Stackoverflow用户

我在使用外键删除两个表中的数据时遇到问题

简介:我创建了一个博客网站,用xampp在本地托管,用PHP和MySQL编写。基本上我已经完成了它的功能,但这不是我来这里的原因。我一次从两个表中删除数据时遇到问题

场景:

我的部分数据库的结构如下图所示

假设一个用户为他的网站创建了一篇帖子,帖子存储在blog_条目表中,用户名从user_table引用,并为该帖子生成一个唯一的条目id

我创建了一个单独的表,用于存储添加到名为entry\u comments的特定帖子中的注释。 对于条目评论,我还引用了用户表中的用户名,这样人们就可以知道是谁对该帖子发表了评论,并引用了博客条目中的条目id

问题是,当用户转到他们的个人资料以删除帖子时,我希望数据库在删除帖子之前删除与该帖子相关的所有评论

我的代码

我是通过在删除帖子之前先删除帖子的评论来实现这一点的,但是我想知道是否有一种方法可以使用如下所示的单个查询从两个表中删除数据

$entry_id = mysqli_real_escape_string($DBConn, $_GET['entry_id']);

        $query1 = "DELETE FROM $entry_comments WHERE entry_id='$entry_id'";
        $result1 = mysqli_query($DBConn, $query1);
        if(!$result1){
            //display error message if query failed
        }
        else{
         $_GLOBAL['message'] = "Comments with id $entry_id has been deleted!!!";
         }
        $query2 = "DELETE FROM $blog_entries WHERE entry_id='$entry_id'";
        $result = mysqli_query($DBConn, $query2);
        if(!$result){
            //display error message if query failed
        }
        else{ $_GLOBAL['message'] .= "Entry with id $entry_id has been deleted!!!";
        include 'profile.php'; //redirect
        }
因此,我尝试缩短查询以使用联接查询,以便使用此查询从两行中删除数据,但它不起作用

DELETE FROM $blog_entries, $entry_comments 
        WHERE $blog_entries.username =  $entry_comments.username
        AND entry_id='$entry_id'
或者我曾经

DELETE be, ec
  FROM $blog_entries be
  JOIN $entry_comments ec ON be.username = ec.username
 WHERE be.entry_id = '$entry_id'
我研究了这个问题,找到的最接近我的问题的答案是:我试图重写我的sql代码以匹配它,但仍然会收到一个错误,说它由于外键而在删除时出现问题,我无法找出我做错了什么

451 - Cannot delete or update a parent row: a foreign key constraint fails (`thenefariousblog`.`entry_comments`, CONSTRAINT `entry_comments_ibfk_2` FOREIGN KEY (`entry_id`) REFERENCES `blog_entries` (`entry_id`))

抱歉,如果这篇文章有点冗长,但我正试图尽可能多地解释我遇到的问题,以便获得最佳反馈

您可以创建一个过程,以正确的顺序删除数据,就像您在两步方法中所做的那样。过程的输入参数将是post ID。通过这种方式,您可以简单地运行:
callremoventry(ID)

您还可以使用ON DELETE CASCADE子句


您还可以尝试暂时禁用外键检查,如下所示:

在任何SQL风格中,通常不能在一条语句中从两个不同的表中删除。实际上,级联删除是唯一一种应该在多个表之间自动执行的删除类型。“您通常不能在任何SQL风格的单个语句中从两个不同的表中删除”MySQL不支持
delete table1,table2…
从两个表中删除吗@TimBiegeleisen正在施工。。它也在手册的“多表语法”部分@riggsfully我修改了我的代码,就像那个答案上的公认答案一样,它与我最初作为我已经尝试过的代码之一所写的代码没有什么不同。我修改了代码以适应您提供的答案,代码运行,但没有任何问题deleted@RaymondNijland. 是的,MySQL可能在某些条件下允许这样做,但我认为它主要用于MyISAM,它不支持级联删除。在InnoDB上,我认为不应该真正使用它。@TimBiegeleisen,RaymondNijland我以为我无法删除注释,因为我在entry_comments表中有两个外键,但这不对,因为我使用的两步方法为我删除注释,所以我有点不知所措:(