2009-08-05 80 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';