繁体   English   中英

在一个查询中从两个表中删除

[英]Delete from two tables in one query

我在 MySQL 中有两个表

#messages table  : 
messageid
messagetitle 
.
.

#usersmessages table 
usersmessageid 
messageid
userid
.
.

现在,如果我想从消息表中删除就可以了。 但是当我通过 messageid 删除消息时,记录仍然存在于 usersmessage 上,我必须立即从这两个表中删除。

我使用了以下查询:

DELETE FROM messages LEFT JOIN usersmessages USING(messageid) WHERE messageid='1' ; 

然后我测试

   DELETE FROM messages , usersmessages 
   WHERE messages.messageid = usersmessages.messageid 
   and messageid='1' ; 

但是这两个查询并没有完成这个任务。

不能用分号隔开吗?

Delete from messages where messageid = '1';
Delete from usersmessages where messageid = '1'

或者

只需使用INNER JOIN如下

DELETE messages , usersmessages  FROM messages  INNER JOIN usersmessages  
WHERE messages.messageid= usersmessages.messageid and messages.messageid = '1'
DELETE a.*, b.* 
FROM messages a 
LEFT JOIN usersmessages b 
ON b.messageid = a.messageid 
WHERE a.messageid = 1

翻译:从 messageid =1 的表消息中删除,如果表uersmessages有 messageid = messageid 表消息,则删除uersmessages表的那一行。

您应该使用ON DELETE CASCADE创建一个FOREIGN KEY

ALTER TABLE usersmessages
ADD CONSTRAINT fk_usermessages_messageid
FOREIGN KEY (messageid)
REFERENCES messages (messageid)
ON DELETE CASCADE

,或者在一个事务中使用两个查询:

START TRANSACTION;;

DELETE
FROM    usermessages
WHERE   messageid = 1

DELETE
FROM    messages
WHERE   messageid = 1;

COMMIT;

但是,事务仅影响InnoDB表。

不需要连接:

DELETE m, um FROM messages m, usersmessages um

WHERE m.messageid = 1 

AND m.messageid = um.messageid 

您有两个选择:

首先,在一个事务中做两条语句:

BEGIN;
  DELETE FROM messages WHERE messageid = 1;
  DELETE FROM usermessages WHERE messageid = 1;
COMMIT;

或者,您可以使用外键设置 ON DELETE CASCADE。 这是更好的方法。

CREATE TABLE parent (
  id INT NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE child (
  id INT, parent_id INT,
  FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE
);

您可以在此处阅读有关 ON DELETE CASCADE 的更多信息。

DELETE message.*, usersmessage.* from users, usersmessage WHERE message.messageid=usersmessage.messageid AND message.messageid='1'

删除后 OP 只是缺少表别名

DELETE t1, t2 
FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id 
WHERE t1.id = some_id

请试试这个

DELETE FROM messages,usersmessages

USING messages

INNER JOIN usermessages on (messages.messageid = usersmessages.messageid)

WHERE messages.messsageid='1'

尝试这个..

DELETE a.*, b.*  
FROM table1 as a, table2 as b  
WHERE a.id=[Your value here] and b.id=[Your value here]

我让id作为示例列。

很高兴这有帮助。 :)

您也可以这样使用,当两列具有 2 个或多个相同的列名时删除特定值。

DELETE project , create_test  FROM project INNER JOIN create_test
WHERE project.project_name='Trail' and  create_test.project_name ='Trail' and project.uid= create_test.uid = '1';

还有另一种这里没有提到的方法(我还没有完全测试它的性能),你可以为所有表设置数组 - >要删除的行,如下所示

// set your tables array
$array = ['table1', 'table2', 'table3'];


// loop through each table
for($i = 0; $i < count($array); $i++){

 // get each single array
 $single_array = $array[$i];

 // build your query
 $query = "DELETE FROM $single_array WHERE id = 'id'";

 // prepare the query and get the connection
 $data = con::GetCon()->prepare($query);

 // execute the action
 $data->execute();
}

然后您可以将用户重定向到主页。

header('LOCATION:' . $home_page);

希望这会帮助某人:)

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM