recursives WHERE bei UPDATE

ZENeca

Grünschnabel
Server-Typ: MariaDB
Server-Version: 10.5.23-MariaDB-1:10.5.23+maria~ubu2004-log - mariadb.org binary distribution
Protokoll-Version: 10

weiß gar nicht welches ein sinnvoller Titel für diese Frage wäre...
Also, ich glaube nicht daß das machbar ist,
weil sich mal wieder die Katze in den Schwanz beißt
aber ich würde es doch gerne mal klären.
Ich versuche mal das Prinzip zusammen zu fassen

geht um ein UPDATE bei dem sich während des Vorgangs ergibt welche weitere Datensätze betroffen sind

Speziell:
Wenn eine Bedingung zutrifft einen Spaltenwert (update_col) zu ändern
sollen auch alle Spaltenwerte (update_col) geändert werden bei denen
einen anderer Spaltenwert (s_col) dieses Datensatzes auf andere zutrifft


Tabellen-Beispiel
Zeilew_cols_colupdate_col
111up_val
212
323up_val
421up_val
532
633up_val
741up_val
842

UPDATE tab SET update_col = up_val
SELECT s_col FROM tab AS t
WHERE w_col = 2 OR s_col = t.s_col
(funktioniert so natürlich nicht)

sollte dann die Zeilen 1, 3, 4, 6 und 7 betreffen

Also:
die erste WHERE Bedingung betrifft Zeile 3 und 4
dort hat s_col den Wert 3 bzw. 1 und jetzt will ich auch alle
Zeilen ändern bei denen der s_col-Wert auch 3 oder 1 ist
gibt es da irgend ein Lösung?

Wenn es dazu eine Abfrage gäbe wäre das sehr elegant,
sonnst müsste ich das halt auf zwei mal machen.

vielen Dank im Voraus
Zen
 
Zuletzt bearbeitet:
Lösung
Interessante Sache. Das Problem, ich verstehe deine gewünschte Logik noch nicht ganz.
Also. Du gehst mit w_col = 2 an den Start. Daraus liest du die s_col aus. In dem Fall 1 und 3.
Dann sollen alle mit s_col in (1,3) angepasst werden.

Ist eigentlich einfach mit einem Subquery
SQL:
UPDATE my_table
SET update_col = 1234
WHERE s_col IN (
    SELECT s_col
    FROM my_table
    WHERE w_col=2
);
Mach doch 2 updates nacheinander, aber in einer Transaktion.

Normalerweise hätte ich AFTER UPDATE trigger gesagt, aber ich glaube mich daran zu erinnern, dass bei MySQL/Maria man keinen trigger auf die gleiche Tabelle machen kann

Wobei ich mir sicher bin, dass man das auch umgehen kann.

EDIT: Man kann in MySQL/Maria keinen Update-Trigger machen, der erneut die Tabelle ändert, für welche der Trigger geschossen wurde (rekursive Trigger).
Versuch workaround: Da in deinem Update ja 2 Tabellen geändert werden, würde ich es mal ausprobieren mit einem AFTER UPDATE-Trigger auf Warenkorb, und innerhalb des Triggers dann eben ei UPDATE auf tdb.
Alle nötigen Daten werden ja geliefert.

also irgendwas in der Art (Ungetestet)
SQL:
CREATE TRIGGER set_tdb_end_am_null_AU AFTER UPDATE ON WARENKORB
FOR EACH ROW
UPDATE TRADE_DB 
SET End_am=NULL
WHERE ID=New.tiid;
 
Zuletzt bearbeitet:
Zurück