[MySQL] Datensätze aus mehreren Tabellen löschen und bearbeiten

mh1001

Lt. Commander
Registriert
Nov. 2003
Beiträge
2.039
[MySQL] Datensätze aus mehreren Tabellen löschen bzw. bearbeiten

Hallo zusammen,

Hier bin ich mal wieder mit einer MySQL-Frage.
Ich suche eine Möglichkeit Datensätze aus mehreren Tabellen zu löschen und zu bearbeiten.
Dabei besitzen alle Tabellen ein gemeinsames Feld "xyz".
Nun sollen zum Beispiel alle Datensätze aus den entsprechenden Tabellen gelöscht werden, in denen dieses Feld zum Beispiel den Wert "1" hat, bzw. dieses auf 0 gesetzt wird.
Natürlich könnte ich das ganze auch mit mehreren Queries und einer Schleife etwa so lösen:

PHP:
$tabellen = array("tabelle1", "tabelle2", "...");

foreach($tabellen as $tabelle)
{
  $loeschen = mysql_query(DELETE FROM `$tabelle` WHERE xyz = '1');
}
Allerdings ist dies nicht gerade in meinem Interesse, da dies bei 123 Queries dann auch nicht mehr so performancefördernd ist. ;)
Ich hoffe dass es noch eine andere, MySQL-seitige Lösung gibt.

Besten Dank schon einmal,

mh1001
 
Zuletzt bearbeitet:
wieviele Tabellen würde das denn betreffen?
 
Zum Löschen wären es etwa 40 Tabellen und zum Bearbeiten knapp 80. Tendenz steigend. ;)

MfG mh1001
 
Zuletzt bearbeitet:
Mein SQL ist lange her, aber geht nicht folgendes:

DELETE FROM tabelle1,tabelle2,tabelle3 WHERE xyz='1'

MfG

Arnd
 
hab ich bei mir mal versucht, bekomm einen SQL Error. Scheint also nicht so zu gehen wie beim SELECT dass man mehrere Tabellen angeben kann...
 
Nein, das klappt leider nicht - war auch mein erster Anlauf gewesen. ;)
Beim Löschen erhalte ich dann Dinge wie:
Code:
 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE xyz = '1'
und beim Bearbeiten sieht es dann so aus:
Code:
 #1052 - Column 'xyz' in field list is ambiguous
Wobei ich der Aussage, dass xyz vieldeutig ist ja auch zustimmen kann, da dieses Feld ja eben in jeder Tabelle vorhanden ist. ;)
Aber irgendeine Möglichkeit muss es da doch geben. ;)

MfG mh1001
 
Zuletzt bearbeitet:
Dann würde ich probieren

DELETE FROM tab1, tab2 WHERE tab1.xuy='1' AND tab2.xyz = '1'

Damit sollte die Eindeutigkeit gegeben sein. Habe es aber nicht ausprobiert, ist nur eine Idee.

MfG

Arnd
 
Hallo,

leider klappt dies auch nicht. :(
Bei "DELETE" kommt der oben beschriebene Fehler. Dieser kommt übrigens, sobald mehr als eine Tabelle angegeben werden - unabhängig vom Folgendem.
Beim Update-Query erhalte ich zwar auch keine Fehlermeldung, jedoch wird kein Datensatz bearbeitet, unabhängig ob ich jetzt "OR" oder "AND" in der WHERE-Klausel angebe.

MfG mh1001
 
Hallo,

kann man das nicht mit einem Trigger machen?
Ich weiß nicht ob es das in MySQL gibt, ich arbeite mit Firebird.

Dann brauchtst du nur in einer Tabelle diese Feld ändern und alle anderen ändert der Trigger.
 
Danke für den Tipp. ;)
Leider stehen Trigger erst in MySQL 5 zur Verfügung (MySQL-Roadmap). Diese befindet sich jedoch noch im Alpha-Status und auf meinen Server werde ich mich auch noch einige Zeit mit der aktuellen MySQL 4-Version abgeben müssen. ;)

MfG mh1001
 
http://dev.mysql.com/doc/mysql/de/delete.html schrieb:
Das Multi-Tabellen-Löschformat wird ab MySQL 4.0.0 unterstützt.

Die Idee ist, dass nur übereinstimmende Zeilen aus den Tabellen, die VOR der FROM-Klausel stehen, gelöscht werden. Die Auswirkung ist, dass Sie Zeilen aus vielen Tabellen zugleich löschen können, sowie dass zusätzliche Tabellen zum Suchen benutzt werden.

Das .*-Zeichen nach den Tabellennamen ist nur aus Gründen der Kompatibilität mit Access vorhanden:
Code:
DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id
In diesem Fall werden übereinstimmende Zeilen nur aus den Tabellen t1 und t2 gelöscht.
 
Darüber bin ich in der MySQL-Dokumentation ja noch gar nicht gestolpert, danke. ;)
Allerding scheint dies auch nicht zu funktionieren.
Sofern dies nun richtig angewendet ist, würde dies in diesem Fall ja zum Beispiel folgendes bedeuten:

Code:
DELETE a, b, c FROM tabelle1 a, tabelle2 b, tabelle3 c WHERE a.id = '1' OR b.id = '1' OR c.id = '1'
Leider wird bei dieser Aktion absolut nichts gelöscht - ob nun mit "AND" oder "OR" oder sonstigem. Auch ist es egal, ob ich nun für die Tabellennamen "Kurznamen" definiere oder diese überall ausschreibe.

MfG mh1001
 
schreibe doch einfach ein stored procedure, das dürfte um einiges schneller sein als jedes mal eine query auszuführen ;)
 
Leider wird es afaik soetwas auch erst in MySQL 5 geben. Oder täusche ich mich da? ;)

MfG mh1001
 
mh1001 schrieb:
Darüber bin ich in der MySQL-Dokumentation ja noch gar nicht gestolpert, danke. ;)
Allerding scheint dies auch nicht zu funktionieren.
Sofern dies nun richtig angewendet ist, würde dies in diesem Fall ja zum Beispiel folgendes bedeuten:

Code:
DELETE a, b, c FROM tabelle1 a, tabelle2 b, tabelle3 c WHERE a.id = '1' OR b.id = '1' OR c.id = '1'
Leider wird bei dieser Aktion absolut nichts gelöscht - ob nun mit "AND" oder "OR" oder sonstigem. Auch ist es egal, ob ich nun für die Tabellennamen "Kurznamen" definiere oder diese überall ausschreibe.

MfG mh1001


Hallo,

so wird nen Schuh draus.

Code:
DELETE a, b, c FROM tabelle1 a, tabelle2 b, tabelle3 c
WHERE a.id = b.id AND a.id = c.id AND a.id = '1'


Viel Spaß damit.

Ciao
 
Besten Dank :) - So geht es schon einmal in die richtige Richtung. ;)
Einzigster Nachteil: Ist in einer Tabelle kein Datensatz von der WHERE-Klausel betroffen, so wird auch aus allen anderen Tabellen nichts gelöscht.
Ich hoffe es gibt hierzu auch noch eine Möglichkeit das ganze zu lösen. ;)

MfG mh1001
 

Ähnliche Themen

Zurück
Oben