Tabella AGGIORNAMENTO basata sulla stessa tabella


12

Ho una tabella con le descrizioni dei prodotti e ogni descrizione del prodotto ha un product_ide un language_id. Quello che voglio fare è aggiornare tutti i campi con un language_iddi 2essere uguale allo stesso product_iddove si language_idtrova 1.

Finora ho provato la seguente query, ma ricevo errori che indicano che MySQL non vuole aggiornare una tabella in cui viene utilizzata anche la tabella nella sottoquery.

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

Esiste un modo "semplice" per aggirare questa limitazione in MySQL? O qualche "trucco"? Sono un po 'sorpreso che la mia query non funzioni, poiché sembra logica.

Risposte:


19

Questo è un affare piuttosto rischioso e posso capire perché. Ha a che fare con il modo in cui MySQL elabora le subquery. Ne ho scritto il 22 febbraio 2011: problema con la subquery di MySQL

L'esecuzione di JOIN che coinvolgono SELECT e SELECT di subquery sono OK. Al contrario, UPDATEs e DELETE possono essere un'avventura che sfida la morte.

SUGGERIMENTO

Prova a refactoring della query in modo che sia un JOIN INNER di due tabelle

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;

Provaci !!!


0

Bene, questo non ha funzionato per me, l'aggiornamento non è stato eseguito anche se c'erano righe corrispondenti. Quello che dovevo fare è creare l'altra tabella come sottoquery così viene utilizzato il file temporaneo.

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;

-3
  1. Per prima cosa creare una tabella vista / temp con l'istruzione select
  2. Esegui query di aggiornamento con join interno

2
Forse puoi migliorare la risposta con un po 'di codice di esempio?
ypercubeᵀᴹ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.