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

时间:2009-08-05 14:01:39

标签: sql mysql

我在mysql中有两个表

#messages table  : 
messageid
messagetitle 
.
.

#usersmessages table 
usersmessageid 
messageid
userid
.
.

现在我想从消息表中删除它没关系。但是当我删除messageid ='1'的消息时,例如它仍然存在于usersmessage上,我必须立即从这两个表中删除;

所以我使用以下查询:

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

然后我测试

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

但是这两个查询并不符合此任务。

11 个答案:

答案 0 :(得分:108)

难道你不能用分号分隔它们吗?

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'

答案 1 :(得分:38)

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 表。

答案 2 :(得分:11)

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

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个表。

答案 3 :(得分:7)

您有两种选择:

首先,在事务中执行两个语句:

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 here的更多信息。

答案 4 :(得分:6)

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

答案 5 :(得分:4)

不需要JOINS:

DELETE m, um FROM messages m, usersmessages um

WHERE m.messageid = 1 

AND m.messageid = um.messageid 

答案 6 :(得分:1)

请试试这个

DELETE FROM messages,usersmessages

USING messages

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

WHERE messages.messsageid='1'

答案 7 :(得分:0)

试试这个..

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

我将id作为示例列。

很高兴这有帮助。 :)

答案 8 :(得分:0)

您也可以使用这样的方法,当两列具有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';

答案 9 :(得分:0)

table1 t1左联接table2 t2在t1上删除t1,t2。id = t2。id在t1.id = some_id

答案 10 :(得分:0)

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

// 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);

希望这会帮助某人:)

谢谢