Ich versuche, von einigen Tabellen sofort zu löschen. Ich habe ein bisschen recherchiert und mir das ausgedacht
DELETE FROM `pets` p,
`pets_activities` pa
WHERE p.`order` > :order
AND p.`pet_id` = :pet_id
AND pa.`id` = p.`pet_id`
Ich erhalte jedoch diesen Fehler
Uncaught Database_Exception [1064]: Ihre SQL-Syntax ist fehlerhaft. In dem Handbuch, das Ihrer MySQL-Serverversion entspricht, finden Sie die richtige Syntax für 'p,
pets_activities
pa ...
Ich habe noch nie einen Kreuztabellen-Löschvorgang durchgeführt, daher bin ich unerfahren und stecke vorerst fest!
Was mache ich falsch?
Verwenden Sie ein JOIN
in der DELETE
-Anweisung.
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
Alternativ können Sie ...
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
... um nur aus pets_activities zu löschen
Siehe http://dev.mysql.com/doc/refman/5.0/en/delete.html
Für das Löschen einzelner Tabellen, jedoch mit referentieller Integrität, gibt es andere Möglichkeiten, mit EXISTS, NOT EXISTS, IN, NOT IN usw. umzugehen. Die obige gibt jedoch an, aus welchen Tabellen mit einem Alias vor der FROM-Klausel gelöscht werden kann Sie aus ein paar ziemlich engen Stellen leichter. Ich neige dazu, in 99% der Fälle EXISTS anzusprechen, und dann gibt es die 1%, bei denen diese MySQL-Syntax den Tag beansprucht.
Da dies eine einfache Eltern-Kind-Beziehung zwischen pets
und pets_activities
Zu sein scheint, ist es besser, die Fremdschlüsseleinschränkung mit einer Löschkaskade zu erstellen.
Auf diese Weise werden beim Löschen einer pets
-Zeile automatisch auch die ihr zugeordneten pets_activities
- Zeilen gelöscht.
Dann wird Ihre Anfrage zu einer einfachen:
delete from `pets`
where `order` > :order
and `pet_id` = :pet_id
Benutze das
DELETE FROM `articles`, `comments`
USING `articles`,`comments`
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4
oder
DELETE `articles`, `comments`
FROM `articles`, `comments`
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4
Ich habe im Moment keine MySQL-Datenbank zum Testen, aber haben Sie versucht, anzugeben, was vor der from-Klausel gelöscht werden soll? Beispielsweise:
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`
Ich denke, die von Ihnen verwendete Syntax ist auf neuere Versionen von MySQL beschränkt.
Die Syntax sieht für mich richtig aus ... versuchen Sie es zu ändern, um INNER JOIN zu verwenden ...
Schauen Sie sich das an: http://www.electrictoolbox.com/article/mysql/cross-table-delete/
Für jeden, der dies 2017 liest, ist dies die Art und Weise, wie ich etwas Ähnliches gemacht habe.
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
Um Zeilen aus mehreren Tabellen zu löschen, wird im Allgemeinen die folgende Syntax verwendet. Die Lösung basiert auf der Annahme, dass eine gewisse Beziehung zwischen den beiden Tabellen besteht.
DELETE table1, table2 FROM table1 inner join table2 on table2.id = table1.id
WHERE [conditions]