romy: DELETE über unbekannt viele Tabellen hinweg...?

Beitrag lesen

Hallo Felix,

aus einer Datenbank (MySQL 5.1.41-community) möchte ich eine Person aus allen Tabellen austragen, die in der Datenbank eine Spalte mit "PersonenID" haben. In meinem Projekt verwende ich (absichtlich) keine foreign keys, sodass die DB nicht von selbst alle PersonenIDs aus ihren Tabellen putzt - und ich möchte das auch genau so haben, damit ich mit meinen Queries während des Entwickelns nicht noch mehr Fehlermeldungen bekomme.

Meiner Meinung nach putzt er auch mit foreign keys nicht selbst, sondern meckert nur, wenn er irgendwas nicht löschen kann. Außer man folgt dem Vorschlag von Matti mit ON DELETE CASCADE. (man kann vermutlich darüber streiten, ob man das wirklich möchte oder nicht, ich bin da kein Experte)

Folgende SQL-Query ist das bisherige Ergebnis meiner Bemühungen, die ohne Fehlermeldung vom MySQL-Server akzeptiert wird, aber leider keine tatsächlichen Löschungen vornimmt:

DELETE benutzer., buchungen., dozenten., personen.

FROM benutzer, buchungen, dozenten, personen
WHERE personen.PersonenID='2';

Es wundert mich, dass es keine Fehlermeldung gibt, denn es enspricht ja nicht der schreibweise für multible tables (Vielleicht täusche ich mich, konnte diese nicht so schnell durchblicken. Ich vermute das gehören noch joins und Aliase dazu, wie du schon feststelltest ;))  
  

> \* Ist mein Ansinnen überhaupt mittels einer einzigen SQL-Query lösbar, oder muss ich das tatsächlich doch "ausprogrammieren"?  

Ich vermute du musst programmieren oder Fremdschlüssel-Constraints verwenden.  
  
Es gibt wohl noch eine weitere Lösung (sinnvoll oder nicht vermag ich nicht zu bewerten ;))  
  
~~~sql
  
DELETE FROM `table1`,`table2`,`table3` USING `table1`  
LEFT JOIN `table2` ON `table2`.`id` = 100  AND any_other_condition_for_table2  
LEFT JOIN `table3` ON `table3`.`id` = 100 AND any_other_condition_for_table3  
WHERE `table1`.`id` = 100  

Dazu musst du in das Statement alle deine Tabellen aufzählen, sollte das Kriterium nicht vorhanden sein, dann hilft der left join beim überlesen.
Das ist ungetestet, weil ich gerade keine DB zur Hand habe.

Viele Grüße
romy