138 votes

Comment supprimer des données de plusieurs tables dans MySQL ?

J'essaie de supprimer des données de plusieurs tables à la fois. J'ai fait quelques recherches, et j'ai trouvé ceci

DELETE FROM `pets` p,
            `pets_activities` pa
      WHERE p.`order` > :order
        AND p.`pet_id` = :pet_id
        AND pa.`id` = p.`pet_id`

Cependant, j'obtiens cette erreur

Uncaught Database_Exception [ 1064 ] : Vous avez une erreur dans votre syntaxe SQL ; consultez le manuel correspondant à la version de votre serveur MySQL pour connaître la bonne syntaxe à utiliser près de 'p', pets_activities pa...

Je n'ai jamais fait de suppression de tableau croisé avant, donc je suis inexpérimenté et coincé pour le moment !

Qu'est-ce que je fais de mal ?

249voto

cadman Points 806

Utilisez un JOIN dans le DELETE déclaration.

DELETE p, pa
      FROM pets p
      JOIN pets_activities pa ON pa.id = p.pet_id
     WHERE p.order > :order
       AND p.pet_id = :pet_id

Vous pouvez également utiliser...

DELETE pa
      FROM pets_activities pa
      JOIN pets p ON pa.id = p.pet_id
 WHERE p.order > :order
   AND p.pet_id = :pet_id

...pour supprimer seulement de de pets_activities

Voir http://dev.mysql.com/doc/refman/5.0/en/delete.html

Pour les suppressions de tables uniques, mais avec une intégrité référentielle, il existe d'autres façons de procéder avec EXISTS, NOT EXISTS, IN, NOT IN, etc. Mais la méthode ci-dessus, qui consiste à spécifier les tables à supprimer à l'aide d'un alias avant la clause FROM, peut vous permettre de vous sortir plus facilement de quelques situations difficiles. J'ai tendance à utiliser un EXISTS dans 99 % des cas, mais il y a les 1 % où cette syntaxe MySQL l'emporte.

21voto

paxdiablo Points 341644

Puisque cela semble être une simple relation parent/enfant entre pets et pets_activities vous feriez mieux de créer votre contrainte de clé étrangère avec une cascade de suppression.

De cette façon, lorsqu'un pets est supprimée, la pets_activities Les lignes qui lui sont associées sont également automatiquement supprimées.

Alors votre question devient simple :

delete from `pets`
    where `order` > :order
      and `pet_id` = :pet_id

2voto

Brandon Horsley Points 4001

Je n'ai pas de base de données mysql à tester pour le moment, mais avez-vous essayé de spécifier ce qui doit être supprimé avant la clause from ? Par exemple :

DELETE p, pa FROM `pets` p,
        `pets_activities` pa
  WHERE p.`order` > :order
    AND p.`pet_id` = :pet_id
    AND pa.`id` = p.`pet_id`

Je pense que la syntaxe que vous avez utilisée est limitée aux nouvelles versions de mysql.

1voto

afgallo Points 777

La syntaxe me semble correcte ... essayez de la modifier pour utiliser INNER JOIN ...

Jetez un coup d'oeil à ça : http://www.electrictoolbox.com/article/mysql/cross-table-delete/

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