MySQL 3.23.52 und Variablen

Hallo,

gibt es unter MySQL in der Version 3.23.52 die Möglichkeit, Variablen wie unter MSSQL (DECLARE) zu definieren und ihnen per SELECT-Abfrage einen Wert zuzuweisen ?
Das Ausgangsproblem welches ich habe ist, dass ich einen Delete über 3 Tabellen hinweg durchführen muss, welche je über eine integer id in zusammenhang stehen (Tabelle1.a=Tabelle2.b und Tabelle2.a=Tabelle3.b). Tabelle 1 und Tabelle 3 stehen in keinem direkten Zusammenhang.
Das gleichzeitige Löschen von Einträgen aus mehreren Tabellen ist allerdings erst ab Version 4 möglich (zumindest wird dies in der Dokumentation behauptet). Jetzt muss ich natürlich zuerst die Schlüssel auslesen um festlegen zu können, welche Zeilen in welcher Tabelle gelöscht werden müssen.

Ich bin froh um alle brauchbaren Tips… :wink:

SQL ist eine mengenbasierte Sprache. Damit läßt sich das Problem vollständig mit Unterabfragen lösen: ‚Lösche aus der Tabelle 3 die Datensätze, die dem folgenden Kriterium entsprechen (Suche aus Tabelle 2 die Daten, die von Tabelle 1 so … eingeschränkt sind)‘ - die Klammern charakterisieren die Unterabfrage. Jede ID einzeln in eine Variable zu packen und dann zu suchen, ist prozedural gedacht, geht an SQL vorbei und würde zu horrenden Laufzeiten führen. Die direkte Sql-Anweisung macht dir dies in einem Durchlauf.

mySql hat - meines Wissens nach - derzeit solche Variablenfeatures nicht. Ich weiß dies jedoch nicht genau, weil ich mySql derzeit nicht verwende.


Gruß, Jürgen Auer

Hallo Jürgen,

zunächst mal danke für die Antwort. Ich bin auch der Ansicht, dass sich das Problem mit einem SQL-Statement lösen lassen muss. Anscheinend bin ich jedoch nicht in der Lage ein solches Statement zu generieren. Die Abfrage, welche alle zu löschenden Records enthält sieht folgendermassen aus:

SELECT * FROM tabelle1 LEFT JOIN tabelle2 ON tabelle1.id = tabelle2.t1id LEFT JOIN tabelle3 ON tabelle2.id = tabelle3.t2id WHERE tabelle1.id = 508;

Im Prinzip ist es das Ergebnis dieser Abfrage, welches in allen drei Tabellen gelöscht werden soll. Wie muss nun das zugehörige DELETE-Statement aussehen ? Egal wie ich es zusammensetze erhalte ich einen Syntaxfehler.

Zumindest beim Sql-Server kann man Daten mit einem Befehl immer nur aus einer Tabelle löschen. Und der Left Join würde ja im Zweifelsfall alle Daten der ersten Tabelle auswählen - sei froh, daß das nicht funktioniert hat.

Damit: Lösche in der Tabelle 3 Daten, die Du durch eine Unterabfrage aus einem Join zwischen Tabelle1 und Tabelle2 ermittelst. In einer zweiten Aktion werden aus der Tabelle2 alle Zeilen gelöscht, die ein Kriterium aus 1 erfüllen, zuletzt werden die Daten aus der ersten Tabelle gelöscht. Drei Tabellen -> drei Delete in der umgekehrten Hierarchie.


Gruß, Jürgen Auer

Hallo Jürgen,

danke für Dein Bemühen. Es gab wirklich keine vereinfachende Lösung für das Problem. Ich habe nun das ganze so gelöst, dass ich in der Programmlogik die Abfragen nach den PK’s durchführe und anschliessend die drei DELETE-Statements zu einer Transaktion zusammenfasse.