96 votes

Supprimer de deux tables en une seule requête

J'ai deux tables dans MySQL

#messages table  : 
messageid
messagetitle 
.
.

#usersmessages table 
usersmessageid 
messageid
userid
.
.

Maintenant, si je veux supprimer la table des messages, c'est bon. Mais lorsque je supprime le message par messageid, l'enregistrement existe toujours dans usersmessage et je dois supprimer ces deux tables en même temps.

J'ai utilisé la requête suivante :

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

Ensuite, je teste

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

Mais ces deux requêtes n'accomplissent pas cette tâche.

150voto

Eric Points 2410

Tu ne peux 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 suit

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

53voto

angry_kiwi Points 1479
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 de la table messages supprimer cette ligne de uersmessages table.

18voto

Quassnoi Points 191041

Vous devez soit créer un FOREIGN KEY con 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 ne concerne que InnoDB des tables, cependant.

8voto

Fred Yates Points 81

Pas besoin de JOINS :

DELETE m, um FROM messages m, usersmessages um

WHERE m.messageid = 1 

AND m.messageid = um.messageid

8voto

Mike Trpcic Points 12741

Vous avez deux options :

D'abord, faites deux déclarations à l'intérieur d'une transaction :

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

Ou bien, vous pouvez configurer ON DELETE CASCADE 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 la CASCADE DELETE. aquí .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X