Comment supprimer de plusieurs tables dans MySQL?

j'essaie de supprimer de quelques tables à la fois. J'ai fait un peu de recherche, et je suis venu avec ce

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; vérifiez le manuel qui correspond à la version de votre serveur MySQL pour la syntaxe correcte à utiliser near 'p, pets_activities pa...

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

Qu'est-ce que je fais de mal?

95
demandé sur Sam 2010-07-26 07:05:00

6 réponses

utilisez un JOIN dans l'énoncé DELETE .

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

... à supprimer uniquement de pets_activités

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

pour les suppressions de table simple, mais avec l'intégrité référentielle, Il ya d'autres façons de faire avec existe, N'existe pas, en, NOT IN, etc. Mais celui ci-dessus où vous spécifiez à partir de quelles tables supprimer avec un alias avant la clause FROM peut vous sortir de quelques points assez serrés plus facilement. J'ai tendance à atteindre an existe dans 99% des cas et puis il y a le 1% où cette syntaxe MySQL prend le jour.

173
répondu cadman 2015-11-19 11:04:06

Puisqu'il semble s'agir d'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.

ainsi, lorsqu'une ligne pets est supprimée, les lignes pets_activities qui lui sont associées sont automatiquement supprimées.

alors votre requête devient une simple:

delete from `pets`
    where `order` > :order
      and `pet_id` = :pet_id
18
répondu paxdiablo 2013-08-24 20:13:33

utiliser cette

DELETE FROM `articles`, `comments` 
USING `articles`,`comments` 
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4

ou

DELETE `articles`, `comments` 
FROM `articles`, `comments` 
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4
12
répondu RN Kushwaha 2015-02-20 05:08:33

la syntaxe me semble correcte ... essayez de le changer pour utiliser INNER JOIN ...

regardez ça: http://www.electrictoolbox.com/article/mysql/cross-table-delete /

2
répondu Andre Gallo 2010-07-26 03:13:41

Je n'ai pas de base de données mysql à tester pour le moment, mais avez-vous essayé de spécifier quoi supprimer 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.

2
répondu Brandon Horsley 2010-07-26 03:51:28

pour quiconque lisant ceci en 2017, c'est comme ça que j'ai fait quelque chose de similaire.

DELETE pets, pets_activities FROM pets inner join pets_activities
on pets_activities.id = pets.id WHERE pets.`order` > :order AND 
pets.`pet_id` = :pet_id

généralement, pour supprimer des lignes de plusieurs tableaux, la syntaxe que je suis est donnée ci-dessous. La solution repose sur l'hypothèse qu'il existe une certaine relation entre les deux tableaux.

DELETE table1, table2 FROM table1 inner join table2 on table2.id = table1.id
WHERE [conditions]
1
répondu Kalesh Kaladharan 2017-10-23 08:38:31