2009-08-05 59 views
46

我已经在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' ; 

但是这两个查询不accoumplish此任务。

回答

86

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

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

OR

只要使用INNER JOIN如下

DELETE messages , usersmessages FROM messages INNER JOIN usersmessages 
WHERE messages.messageid= usersmessages.messageid and messages.messageid = '1' 
+1

如果我想把这段代码放到循环中会发生什么?我知道我可以绝对地把分号。 – mehdi 2009-08-05 14:14:54

+7

@mehdi:IT会在循环中一遍又一遍地执行删除... – Eric 2009-08-05 14:16:27

+1

它可以放在一个循环中。您可以通过编程方式进行操作,并将消息ID作为参数发送。只要你不继续发送相同的ID,它不会一遍又一遍地删除。 – Eric 2009-08-05 14:17:51

10

您应该创建一个FOREIGN KEYON 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表,但。

+2

您可以*从一个查询中的多个表中删除! http://dev.mysql.com/doc/refman/5.0/en/delete.html – txwikinger 2009-08-05 14:10:20

+0

是的,你可以!但对我来说......做我的回答所说的话更容易。 – Eric 2009-08-05 14:11:43

+0

嗯......对,你可以:) – Quassnoi 2009-08-05 14:33:02

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

+0

谢谢。 'BEGIN; .... COMMIT;' – Shafizadeh 2015-09-19 10:18:23

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

翻译:从表中删除消息其中的MessageID = 1,如果表uersmessages具有邮件ID =表中的邮件ID 消息,删除的uersmessages表该行。

+0

对所有人的评论:如这个例子所示,指定删除应该在哪个表中工作是很重要的。好的帖子@angry_kiwi – 2015-04-28 09:54:16

+0

我只是想改变顺序,FROM usersmessages b LEFT JOIN消息一个 – Pablo 2015-06-18 12:10:26

1

试试这个请

DELETE FROM messages,usersmessages 

USING messages 

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

WHERE messages.messsageid='1' 
5
DELETE message.*, usersmessage.* from users, usersmessage WHERE message.messageid=usersmessage.messageid AND message.messageid='1' 
3

无需连接:

DELETE m, um FROM messages m, usersmessages um 

WHERE m.messageid = 1 

AND m.messageid = um.messageid 
0

试试这个..

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

我让id作为样本列。

很高兴这有助于。 :)

+0

为了正确渲染星号('*'),你需要在查询前面缩进4个空格。 – 2017-10-01 10:26:52

0

您也可以像这样使用,以删除特定值,当两列或许多列的名称相同。

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';