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
mysql update select in

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!

5 Kommentare » Schreibe einen Kommentar

  1. Hi,

    ich habe das gleiche Problem, bin allerdings nicht der MySQL Experte. Mir fehlt gerade die Erleuchtung für die Umsetzung.

    Abfrage 1:
    delete from radacct where radacctid in (
    select t2.radacctid
    from radacct t1
    join radacct t2 on t1.acctuniqueid = t2.acctuniqueid AND t1.radacctid < t2.radacctid
    )

    Abfrage2:
    DELETE FROM radacct
    USING radacct, radacct Dup
    WHERE EXISTS (
    SELECT radacctid FROM radacct Dup WHERE radacct.acctuniqueid = Dup.acctuniqueid AND radacct.radacctid < Dup.radacctid);

    Die Beiden Abfragen funktionieren, wenn ich doppelte Datensätze anzeigen möchte. Allerdings erhalte ich den Fehler, sobald delete angewendet wird.

  2. Puh, beide sehen irgendwie auch nach meinem ursprünglichen Problem aus, dass durch die gleich Lösung gefixt werden kann. Ich muss mir aber mal beide heute Abend genauer ansehen. Sind schon was verstrickt.

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.