web-dev-qa-db-fra.com

supprimer de deux tables dans une requête

j'ai deux tables dans mysql 

#messages table  : 
messageid
messagetitle 
.
.

#usersmessages table 
usersmessageid 
messageid
userid
.
.

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

donc j'utilise la requête suivante: 

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

alors je teste 

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

mais ces deux requêtes ne permettent pas d'accomplir cette tâche. 

55
mehdi

Ne pouvez-vous pas les séparer par un point-virgule?

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'
104
Eric
DELETE a.*, b.* 
FROM messages a 
LEFT JOIN usersmessages b 
ON b.messageid = a.messageid 
WHERE a.messageid = 1

translation: delete from table messages where messageid = 1, si table uersmessages has messageid = messageid de table messages , supprime cette ligne de uersmessages table. 

38
angry kiwi

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 dans une transaction:

START TRANSACTION;;

DELETE
FROM    usermessages
WHERE   messageid = 1

DELETE
FROM    messages
WHERE   messageid = 1;

COMMIT;

La transaction n'affecte que les tables InnoDB, cependant.

11
Quassnoi

Vous avez deux options:

Commençons par 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 ON DELETE CASCADE configuré 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 DELETE CASCADE ici .

7
Mike Trpcic
DELETE message.*, usersmessage.* from users, usersmessage WHERE message.messageid=usersmessage.messageid AND message.messageid='1'
6
johan

pas besoin de JOINS: 

DELETE m, um FROM messages m, usersmessages um

WHERE m.messageid = 1 

AND m.messageid = um.messageid 
4
Fred Yates

Essayez ceci s'il vous plaît 

DELETE FROM messages,usersmessages

USING messages

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

WHERE messages.messsageid='1'
1
Amit

Essaye ça..

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 exemple de colonne.

Content que cela aide. :) 

0

Vous pouvez également utiliser comme ceci, pour supprimer une valeur particulière lorsque les deux colonnes ont 2 noms identiques ou plus.

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

SUPPRIMER t1, t2 DE table1 t1 LEFT JOIN _table2 t2 SUR t1 .id = t2 .id O t1.id = un_id

0
Mark Angelo Pascual