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

时间:2018-08-20 14:37:23

标签: php mysql sql

嗨,Stackoverflow用户,

我在删除带有外键的两个表中的数据时遇到问题。

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

场景:

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

enter image description here

假设某个用户为其网站创建了一条帖子,该帖子存储在表格blog_entries中, username 被引用来自 user_table ,并且为此帖子生成了一个唯一的entry_id 。

我创建了一个单独的表,用于存储添加到名为 entry_comments 的特定帖子中的评论。 对于条目注释,我还引用了 user_table 中的用户名,这样人们就可以分辨出谁发表了评论,并引用了来自 blog_entries 的 entry_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
        }

因此,我尝试将查询缩短为使用Join查询,以便使用此查询从两行中删除数据,但这没有用。

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'

我研究了这个问题,发现的最接近问题的答案是:How to delete from multiple tables in 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`))

很抱歉,如果这篇文章有点冗长,但我想尽我所能解释的问题,以便获得最佳反馈

1 个答案:

答案 0 :(得分:0)

您可以创建过程来按照正确的顺序删除数据,就像在两步方法中一样。过程的输入参数将是职位ID。这样,您只需运行:call removeEntry(ID);

您还可以使用ON DELETE CASCADE子句。

您还可以尝试暂时禁用外键检查,例如:How to temporarily disable a foreign key constraint in MySQL?