web-dev-qa-db-fra.com

Comment supprimer de plusieurs tables dans MySQL?

J'essaie de supprimer de quelques tables à la fois. J'ai fait un peu de recherche, et est venu avec cette

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

Cependant, je reçois 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 syntaxe à utiliser près de 'p, pets_activities pa ...

Je n'ai jamais supprimé de tableau croisé auparavant, alors je suis inexpérimenté et bloqué pour l'instant!

Qu'est-ce que je fais mal?

105
alex

Utilisez un JOIN dans l'instruction 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

Sinon, vous pouvez 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 uniquement de pets_activities

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

Pour les suppressions de table uniques, mais avec une intégrité référentielle, il existe d'autres méthodes de création avec EXISTS, NOT EXISTS, IN, NOT IN, etc. vous sortir plus facilement de quelques endroits relativement restreints. J'ai tendance à contacter un EXISTS dans 99% des cas, puis il y a le 1% où cette syntaxe MySQL prend la journée.

189
cadman

Comme 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, quand une ligne pets est supprimée, le pets_activities les lignes qui lui sont associées sont également automatiquement supprimées.

Votre requête devient alors simple:

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

Utilisez ceci

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
13
RN Kushwaha

Je n'ai pas de base de données mysql à tester pour le moment, mais avez-vous essayé de spécifier ce qu'il faut 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 versions plus récentes de mysql.

2
Brandon Horsley

La syntaxe me semble juste ... essayez de la changer pour utiliser INNER JOIN ...

Regardez ceci: http://www.electrictoolbox.com/article/mysql/cross-table-delete/

2
Andre Gallo

Pour tous ceux qui liront ceci en 2017, voici comment 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 tables, la syntaxe que je suis est donnée ci-dessous. La solution repose sur l'hypothèse qu'il existe une relation entre les deux tableaux.

DELETE table1, table2 FROM table1 inner join table2 on table2.id = table1.id
WHERE [conditions]
1
Kalesh Kaladharan