MySQL: UPDATE/DELETE kombinieren

Galanos

Aktives Mitglied
Thread Starter
Dabei seit
19.12.2005
Beiträge
625
Reaktionspunkte
23
Hallo zusammen :)

Ich suche nach einem SQL-Befehl, der eine Aktualisierung und eine Loeschung kombiniert. Das Ganze koennte ich auch mittels einem PHP-Script loesen, nur waere ein einzelner Query eleganter und weniger anfaellig fuer Fehler und spart ausserdem – maessig – Rechenzeit.

Ich habe in meinem Shop vier (relevante) Tabellen, „Artikel“, „Bestellte_Artikel“, „Bestellungen“ und „Kunden“.
Bei der Stornierung einer Bestellung halte ich es bisher so, dass ich mittels folgendem Query die Bestellung, die dazugehoerigen Bestellten Artikel und den Kunden loesche (ja, auch den Kunden, andere Geschichte):
Code:
DELETE Bestellte_Artikel, Bestellungen, Kunden 
FROM Bestellte_Artikel, Bestellungen, Kunden 
WHERE Bestellte_Artikel-Bestellung = Bestellungen-ID AND Bestellungen-Kunde = Kunden-ID AND Bestellungen-ID = XYZ
Die ersten 2 WHERE-Klauseln dienen natuerlich dazu, die Verbindung zwischen den Tabellen herzustellen, „XYZ“ ist die zu loeschende Bestellung.

Anschliessend stelle ich die Anzahl der Artikel auf Lager (in der Tabelle „Artikel“) per phpMyAdmin auf die Zahl vor der Bestellung. Dies liesse sich aber auch folgendermassen ausdruecken:
Code:
UPDATE Artikel, Bestellte_Artikel 
SET Artikel_AufLager = (Artikel-AufLager + Bestellte_Artikel-Anzahl) 
WHERE Artikel-ID = Bestellte_Artikel-Artikel AND Bestellte_Artikel-Bestellung = XYZ

Nun moechte ich gern diese beiden Queries verbinden, moeglicherweise mit einem Nested Query. Dabei sollte zuerst die Anzahl auf Lager wieder hochgestellt und anschliessend die uebliche Loeschung vorgenommen werden. Vielleicht in diese Richtung:
Code:
DELETE bla 
FROM bla 
WHERE 
(UPDATE bla 
SET bla 
WHERE bla = XYZ)
Nur … wie uebergebe ich die Bestellungs-ID vom inneren zum aeusseren Query? Kann sein, dass ich da einem Denkfehler erliege, aber mir erscheint das Problem so alltaeglich, dass ich beinahe eine Patentloesung vermute :)

Ah ja, es geht um MySQL 5.x. Mir ist klar, dass ich einfach 2 per Semikolon getrennte Befehle schreiben und mittels Script abklappern koennte, aber das waere irgendwie unheimlich holperig.

Kann mir da jemand helfen?

Schon mal danke, Galanos
 
Ich habe noch mal meine 2 SQL-Buecher durchforstet, es scheint keine Traumloesung zu geben. Nested Queries duerfen nur SELECT-Anweisungen enthalten. Ich denke, ich werde einfach zwei getrennte Queries daraus machen und gut.
 
(1) das was Du da gerade ausbadest ist die Folge von ungünstigem DB-Design! Eine Tabelle bestellte_artikel macht keinen Sinn. Ein Artikel ist ein Artikel eine Bestellung ist eine Relation aus einem Kunden und diversen Artikelmengen.

(2) Das was Du da versuchst gehört in der Tat nicht in einen Befehl, wohl aber in eine Transaktion. Sprich: Es ist nur als Ganzes abzuwickeln.
 
Zu 1.: Nun, eine "Bestellung" enthaelt bei uns diverse "Bestellte Artikel". Ein Eintrag in "Bestellte_Artikel" enhaelt – an relevanten Feldern – eine Referenz zum (Inventar-)Artikel (Tabelle "Artikel"), eine Referenz zur Bestellung (Tabelle "Bestellungen") und die Menge.
Ich wuesste nicht, wie ohne :)

Zu 2.: Die Tabellen sind alle in MyISAM :/
 
Zurück
Oben Unten