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?
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.
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
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
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.
La syntaxe me semble juste ... essayez de la changer pour utiliser INNER JOIN ...
Regardez ceci: http://www.electrictoolbox.com/article/mysql/cross-table-delete/
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]