MySQL: UPDATE mit SELECT IN

Manchmal glaubst Du MySQL sei schon was dösig, bis Du merkst, dass der dösige eigentlich Du selber bist. So ist es mir mal wieder ergangen! Ich wollte für ein UPDATE mit Hilfe eines SELECTs die passenden Daten herausholen. Da es sich um mehrere datenzeilen handelt (mehrere Ergebnisse) käme ich hier auch an einem IN nicht vorbei.

Hier also die erste nicht funktionierende Variante, die mir so logisch in den Kopf gekommen ist:

UPDATE WHERE IN SELECT

UPDATE products p1 
SET p1.products_weight = 250.00 
WHERE p1.products_id IN 
(
  SELECT p.products_id 
  FROM products p2 
  JOIN products_to_categories p2c ON p2.products_id=p2c.products_id  
  WHERE p2c.categories_id=1
)

MySQL quittiert diese Query mit einer Fehlermeldung

#1093 – You can’t specify target table ‘p1′ for update in FROM clause

Soll heißen, dass Du kein Update auf einer Tabelle ausführen kannst, aus der Du die daten für das Update heranziehst. Doch warum funktioniert das nicht? Klingt doch nach einer logischen Struktur? Eigentlich gibt es nur eine ganz simple Antwort: mögliche Unendlichschleife!

Im Updateprozess können Werte verändert werden, die dann wieder von der From Klausel als Eingabe in Frage kämen. So würde das Update u.U. nie fertig werden.

Für so ein Update ist es jedoch gar nicht notwendig, ein so komplexes UPDATE WHERE IN SELECT auszuführen. UPDATE kann selbst mit JOINs umgehen und kann genau wie im SELECT auch die passenden Einträge selber sich zusammensuchen!

UPDATE ohne SELECT definieren

UPDATE products p 
JOIN products_to_categories p2c ON p.products_id=p2c.products_id 
SET p.products_weight = 250.00 
WHERE p2c.categories_id=1

Das UPDATE kann nun natürlich noch mit komplexeren JOINs verfeinert werden. Die genaue Syntax von UPDATE gibt es hier

Was sagst Du zu dieser Lösung?

Hat Sie Dir geholfen? Hat Sie Dein Problem gelöst? Wenn ja, würd ich mich über ein Rückmeldung freuen, wenn nein, dann schreib doch mal, woran es noch hapert. Wir finden schon eine Lösung!

Hinterlasse eine Antwort

Pflichtfelder sind mit * markiert.


Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>