UPDATE-Tabelle basierend auf derselben Tabelle

12

Ich habe eine Tabelle mit Produktbeschreibungen, und jede Produktbeschreibung hat a product_idund a language_id. Was ich tun möchte, ist, alle Felder mit einem language_idvon 2zu aktualisieren , um dem selben gleich zu sein, in dem product_iddas language_idist 1.

Bisher habe ich die folgende Abfrage versucht, aber es wird eine Fehlermeldung angezeigt, dass MySQL keine Tabelle aktualisieren möchte, in der die Tabelle auch in der Unterabfrage verwendet wird.

UPDATE
  products_description AS pd
SET 
  pd.products_seo = (
    SELECT
      pd2.products_seo
    FROM 
      products_description AS pd2
    WHERE
        pd2.language_id = 1
    AND pd2.products_id = pd.products_id
  )
WHERE
  pd.language_id <> 1

Gibt es einen "einfachen" Weg, um diese Einschränkung in MySQL zu umgehen? Oder irgendwelche "Tricks"? Ich bin ein wenig überrascht, dass meine Abfrage nicht funktioniert, da dies logisch erscheint.

nathangiesbrecht
quelle

Antworten:

19

Das ist eine ziemlich riskante Angelegenheit, und ich kann verstehen, warum. Es hängt damit zusammen, wie MySQL Unterabfragen verarbeitet. Ich schrieb am 22. Februar 2011 darüber: Problem mit der MySQL-Unterabfrage

Das Durchführen von JOINs mit SELECTs und SELECTs für Unterabfragen ist in Ordnung. Auf der anderen Seite können UPDATEs und DELETE ein ziemlich todesmutiges Abenteuer sein.

VORSCHLAG

Versuchen Sie, die Abfrage so umzugestalten, dass es sich um einen INNER JOIN von zwei Tabellen handelt

UPDATE
    products_description pd INNER JOIN products_description pd2 ON
    (pd.products_id=pd2.products_id AND pd2.language_id=1 AND pd.language_id<>1)
SET pd.products_seo = pd2.products_seo;

Versuche es !!!

RolandoMySQLDBA
quelle
0

Nun, das hat bei mir nicht funktioniert, das Update ist einfach nicht passiert, obwohl es übereinstimmende Zeilen gab. Was ich tun musste, ist die andere Tabelle als Unterabfrage zu erstellen, damit temporäre Datei verwendet wird.

UPDATE tmContact 
INNER JOIN (
SELECT par.id, IF (LENGTH(contact.dynamicValues) > LENGTH(par.dynamicValues), contact.dynamicValues, par.dynamicValues) upd FROM tmContact par
INNER JOIN tmContact contact ON par.id = contact.linkCompanyId AND contact.linkCompanyId IS NOT NULL
WHERE contact.id IS NOT NULL AND contact.dynamicValues <>  par.dynamicValues AND LENGTH(contact.dynamicValues) > LENGTH(par.dynamicValues)
) input ON input.id = tmContact.id
SET tmContact.dynamicValues = upd;
Galvani
quelle
-3
  1. Erstellen Sie zuerst eine View / Temp-Tabelle mit der Select-Anweisung
  2. Führen Sie eine Aktualisierungsabfrage mit innerem Join aus
Sankar Kodali
quelle
2
Vielleicht können Sie die Antwort mit einem Beispielcode verbessern?
Ypercubeᵀᴹ