用一条sql语句删除两个表中的数据

o7jaxewo  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(1014)

这个问题在这里已经有答案了

搜索然后从两个表中删除(2个答案)
两年前关门了。
嗨,stackoverflow用户,
我在删除两个带有外键的表中的数据时遇到问题。
简介:我用xampp在本地创建了一个博客网站,用php和mysql编写。基本上我已经完成了它的功能,但这不是我来这里的原因。一次从两个表中删除数据有问题。
脚本:
我的部分数据库结构如下图所示

假设一个用户为他的网站创建了一篇文章,文章存储在blog\u entries表中,username从user\u表中引用,并为该文章生成一个惟一的条目\u id。
我创建了一个单独的表,用于存储添加到名为entry\u comments的特定帖子中的注解。对于条目注解,我还引用了user\表中的username,这样人们就可以知道是谁做了注解,并引用了该文章的blog\条目中的条目\ 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'

我研究了这个问题,发现最接近我的问题的答案是:如何从mysql的多个表中删除?我试图重写我的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`))

抱歉,如果这篇文章感觉有点冗长,但我试图解释的问题,我有尽可能多,以获得最好的反馈

v1l68za4

v1l68za41#

您可以像在两步方法中所做的那样,创建以正确顺序删除数据的过程。过程的输入参数将是post id。通过这种方式,您可以简单地运行: call removeEntry(ID); 也可以使用on delete cascade子句。
您还可以尝试临时禁用外键检查,如下面所示:如何临时禁用mysql中的外键约束?

相关问题