Comment supprimer de plusieurs tables dans MySQL?

J’essaie de supprimer quelques tableaux à la fois. J’ai fait un peu de recherche et j’ai eu cette idée

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; vérifiez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de ‘p, pets_activities pa …

Je n’ai jamais fait une suppression de table croisée auparavant, donc je suis inexpérimenté et coincé pour l’instant!

Qu’est-ce que je fais mal?

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 

… à supprimer uniquement de pets_activities

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

Pour les suppressions à table unique, mais avec une intégrité référentielle, il existe d’autres manières de faire avec EXISTS, NOT EXISTS, IN, NOT IN, etc. Mais celle ci-dessus où vous spécifiez les tables à supprimer vous sortir de quelques endroits assez serrés plus facilement. J’ai tendance à toucher un EXISTS dans 99% des cas, puis il y a le 1% où cette syntaxe MySQL prend le jour.

Étant donné que cela semble être une simple relation parent / enfant entre les pets et pets_activities , il serait préférable de créer une contrainte de clé étrangère avec une cascade de suppression.

Ainsi, lorsqu’une ligne d’ pets est supprimée, les lignes pets_activities 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 

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 

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

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

Je n’ai pas de firebase database 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.

Pour ceux qui lisent 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 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 tables.

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