Tabela aktualizacji oparta na tej samej tabeli

12

Mam tabelę z opisami produktów, a każdy opis produktu ma a product_idi a language_id. Co chcę zrobić jest aktualizowanie wszystkich pól z language_idod 2być równa samo product_idgdzie language_idjest 1.

Do tej pory wypróbowałem następujące zapytanie, ale otrzymuję błędy wskazujące, że MySQL nie chce aktualizować tabeli, w której tabela jest również używana w podzapytaniu.

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

Czy istnieje MySQL w „prosty” sposób na ominięcie tego ograniczenia? A może jakieś „sztuczki”? Jestem trochę zaskoczony, że moje zapytanie nie działa, ponieważ wydaje się logiczne.

nathangiesbrecht
źródło

Odpowiedzi:

19

To dość ryzykowny biznes i rozumiem dlaczego. Ma to związek ze sposobem, w jaki MySQL przetwarza podkwerendy. Napisałem o tym 22 lutego 2011 r .: Problem z podkwerendą MySQL

Wykonywanie JOIN z udziałem SELECT i subquery SELECT jest OK. Z drugiej strony, AKTUALIZACJE i USUWANIE mogą być przygodą raczej śmiertelną.

SUGESTIA

Spróbuj przefaktoryzować zapytanie, aby było to WEJŚCIE WEWNĘTRZNE dwóch tabel

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;

Spróbuj !!!

RolandoMySQLDBA
źródło
0

Cóż, to nie działało dla mnie, aktualizacja po prostu się nie wydarzyła, mimo że pasowały wiersze. Musiałem utworzyć drugą tabelę jako podzapytanie, aby użyć pliku tymczasowego.

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
źródło
-3
  1. Najpierw utwórz tabelę widoku / temp z instrukcją select
  2. Uruchom zapytanie o aktualizację z łączeniem wewnętrznym
Sankar Kodali
źródło
2
Być może możesz poprawić odpowiedź za pomocą przykładowego kodu?
ypercubeᵀᴹ