2009-08-05 9 views
46

j'ai deux tables dans MySQLsupprimer de deux tables dans une requête

#messages table : 
messageid 
messagetitle 
. 
. 

#usersmessages table 
usersmessageid 
messageid 
userid 
. 
. 

maintenant je veux supprimer de la table des messages qu'il est ok. mais quand je supprime un message avec messageid = '1' par exemple il existe toujours sur le message de l'utilisateur je dois supprimer de ces deux tables à la fois;

donc j'utiliser la requête suivante:

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

puis-je tester

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

mais ces deux requêtes est accoumplish pas cette tâche. Vous ne pouvez pas simplement les séparer par un point-virgule?

Répondre

86

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

OU

Il suffit d'utiliser INNER JOIN comme ci-dessous

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

Je sais que je peux mettre le point-virgule absolument. – mehdi

+7

@mehdi: IT effectuerait la suppression encore et encore dans une boucle ... – Eric

+1

Il peut être mis dans une boucle. Vous pouvez le faire par programme et envoyer l'identifiant du message en tant que paramètre. Tant que vous ne continuez pas à lui envoyer le même identifiant, il ne le fera pas encore et encore. – Eric

10

Vous devez soit créer un FOREIGN KEY avec ON DELETE CASCADE:

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

, ou le faire en utilisant deux requêtes en un transacti sur:

START TRANSACTION;; 

DELETE 
FROM usermessages 
WHERE messageid = 1 

DELETE 
FROM messages 
WHERE messageid = 1; 

COMMIT; 

transaction ne concerne que les InnoDB tables, cependant.

+2

Vous pouvez * supprimer * de plusieurs tables en une seule requête! http://dev.mysql.com/doc/refman/5.0/en/delete.html – txwikinger

+0

oui vous pouvez! Mais pour moi ... c'est plus facile de faire ce que ma réponse a dit. – Eric

+0

Ummm ... droite, vous pouvez :) – Quassnoi

7

Vous avez deux options:

d'abord, faire deux déclarations dans une transaction:

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

Ou, vous pourriez avoir sur SUPPRIMER CASCADE mis en place avec une clé étrangère. C'est la meilleure approche.

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

Vous pouvez en savoir plus sur ON SUPPRIMER CASCADE here.

+0

Merci. +1 pour "BEGIN"; .... COMMIT; ' – Shafizadeh

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

traduction: supprimer de la table messages où messageid = 1, si la table uersmessages a messageid = messageid du tableau messages, supprimer cette ligne de uersmessages de table.

+0

commentaire pour tous: comme indiqué dans cet exemple, il est important de spécifier dans quelle table la suppression devrait fonctionner. Great post @angry_kiwi –

+0

Je devais juste changer l'ordre, FROM usermessages b Messages LEFT JOIN a – Pablo

1

Essayez cette s'il vous plaît

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

pas besoin de REJOINT:

DELETE m, um FROM messages m, usersmessages um 

WHERE m.messageid = 1 

AND m.messageid = um.messageid 
0

Essayez cette ..

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

je laisse id comme une colonne d'échantillon.

Heureux que cela aide. :)

+0

Pour que les astérisques ('*') soient rendus correctement, vous devez mettre en retrait la requête avec 4 espaces devant lui. –

0

Vous pouvez également utiliser comme ceci, pour supprimer une valeur particulière lorsque les deux colonnes ont 2 ou plusieurs de même nom de colonne. Que se passe-t-il si je veux mettre ce code en boucle?

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