it-swarm.com.de

Wie lösche ich aus mehreren Tabellen in MySQL?

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?

105
alex

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.

189
cadman

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
19
paxdiablo

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

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.

2
Brandon Horsley

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/

2
Andre Gallo

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]
1