Seite 1 von 1

MySQL: Zusammenhängende Datensätze elegant&einfach lösch

Verfasst: 05.05.2010, 09:50
von Andreas I.
Hallo, wie gehe ich am besten vor, wenn ich zusammengehörende Datensätze löschen möchte?
Angenommen, ich habe Tabellen mit Städten, Restaurants und Restaurantkritiken. Die Tabelle Restaurants hat Einträge mit Verweis auf Städte. Die Tabelle Kritiken hat Einträge mit Verweis auf Restaurants.

So... Jetzt lösche ich einen Ort und möchte, dass auch alle dazugehörigen Restaurants und Restaurantkritiken verschwinden. Wie ich das "zu Fuß" mit ein paar Schleifen löse, weiß ich selber.

Aber gibt es da auch eine einfache und elegante Möglichkeit?

Verfasst:
von
SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Verfasst: 05.05.2010, 10:03
von Synonym
Du kannst mit DELETE auch tabellenübergreifend arbeiten. Alles was per SELECT und JOIN abrufbar ist funktioniert auch mit DELETE (jedoch ohne LIMIT und ORDER BY)

Verfasst: 05.05.2010, 10:03
von webtechnixx
Welche Art Tabellen verwendest du ? myIsam oder InnoDB ?

Bei InnoDB Tables lässt sich das wunderbar mit einem ForeignKey ... OnDelete Cascade lösen ...

Schreib mal nähere Infos büdde ...

Verfasst: 05.05.2010, 10:15
von Andreas I.
@Synonym: Danke!
@webtechnixx: In diesem Fall ist es MyISAM.

Verfasst: 05.05.2010, 10:20
von DanielS
Du kannst auch, wenn Du nicht zu viel mit JOIN arbeiten willst:
- erst alle Orte löschen, die Du löschen möchtest
- dann alle Restaurants "WHERE NOT EXISTS (select ort from ort where ord_id = restaurant.ort_id)
- dann analog alle Kritiken löschen

Verfasst: 05.05.2010, 13:36
von kostaki
Ein Beispiel:

Code: Alles auswählen

DELETE
FROM
    user,
    bla,
    blub
USING users AS user
LEFT JOIN bla AS bla
    ON user.id = bla.user_id
LEFT JOIN blub AS blub
    ON user.id = blub.user_id
WHERE user.id = '1'
Nicht das schnellste, aber so hat man alles in einem Query. Der wirkliche Query ist bei mir noch um 30 Tabellen länger. Es kann sein das es so nicht funktioniert. Kommt drauf an welche MySQL Version du hast.

https://dev.mysql.com/doc/refman/5.1/de/delete.html

Verfasst: 07.05.2010, 07:18
von nerd
oder schreib einen trigger der anspringt wenn du ein delete auf tbl 'orte' ausfuehrst. die variante mit den foreign keys hatte ich mal ausproviert, geht allerdings nur wenn alle tabellem den gleichen tabletype haben, was allerdings aus anderen gruenden nicht immer von vorteil ist (vgl. https://www.softwareprojects.com/resour ... -1470.html ).