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?
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.
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
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
la syntaxe me semble correcte ... essayez de le changer pour utiliser INNER JOIN ...
regardez ça: http://www.electrictoolbox.com/article/mysql/cross-table-delete /
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.
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]