2009-08-05 14 views
46

ho due tabelle in mysqleliminare da due tabelle in una query

#messages table : 
messageid 
messagetitle 
. 
. 

#usersmessages table 
usersmessageid 
messageid 
userid 
. 
. 

ora voglio cancellare dalla tabella dei messaggi è ok. ma quando cancello il messaggio con messageid = '1' per esempio è ancora presente sul messaggio degli utenti, devo cancellare da queste due tabelle contemporaneamente;

così ho utilizzare la seguente query:

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

poi verifico

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

ma questa due interrogazioni non è accoumplish questo compito.

risposta

86

Non puoi semplicemente separarli da un punto e virgola?

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

O

Basta usare INNER JOIN come di seguito

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

cosa succede se voglio inserire questo codice in un ciclo? so che posso mettere il punto e virgola assolutamente. – mehdi

+7

@mehdi: IT eseguirà l'eliminazione più e più volte in un ciclo ... – Eric

+1

Può essere messo in un ciclo. Puoi farlo a livello di programmazione e inviare l'id del messaggio come parametro. Finché non continui a inviarlo lo stesso id non lo farà più e più volte. – Eric

10

Si dovrebbe creare un FOREIGN KEY con ON DELETE CASCADE:

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

, o farlo utilizzando due query in un transacti on:

START TRANSACTION;; 

DELETE 
FROM usermessages 
WHERE messageid = 1 

DELETE 
FROM messages 
WHERE messageid = 1; 

COMMIT; 

transazione riguarda solo InnoDB tavoli, però.

+2

È possibile * cancellare * da più tabelle in un'unica query! http://dev.mysql.com/doc/refman/5.0/en/delete.html – txwikinger

+0

sì, è possibile! Ma per me ... è più facile fare quello che ha detto la mia risposta. – Eric

+0

Ummm ... giusto, puoi :) – Quassnoi

7

Tu hai due opzioni:

primo luogo, fare due affermazioni all'interno di una transazione:

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

Oppure, si potrebbe avere ON DELETE CASCADE impostato con una chiave esterna. Questo è l'approccio migliore.

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

Si può leggere di più su ON DELETE CASCADE here.

+0

Grazie. +1 upvote per 'BEGIN; .... COMMIT; ' – Shafizadeh

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

traduzione: eliminare dal tavolo messaggi dove MessageId = 1, se la tabella uersmessages ha MessageId = messageid del tavolo messaggi, eliminare quella fila di uersmessages tavolo.

+0

commento per tutti: come mostrato in questo esempio, è importante specificare in quale tabella dovrebbe funzionare l'eliminazione. Great post @angry_kiwi –

+0

Ho dovuto solo cambiare l'ordine, FROM usersmessages b LEFT JOIN messages a – Pablo

1

Prova questo per favore

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

alcuna necessità per i join:

DELETE m, um FROM messages m, usersmessages um 

WHERE m.messageid = 1 

AND m.messageid = um.messageid 
0

Prova questa ..

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

ho lasciato id come una colonna del campione.

Felice di aiutare. :)

+0

Così che gli asterischi ('*') sono resi correttamente devi far rientrare la query con 4 spazi di fronte. –

0

È anche possibile utilizzare in questo modo, per eliminare un valore particolare quando entrambe le colonne hanno 2 o più nomi di colonne uguali.

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