Tabela UPDATE com base na mesma tabela

12

Eu tenho uma tabela com descrições de produtos e cada descrição de produto possui a product_ide a language_id. O que eu quero fazer é atualizar todos os campos com a language_idde 2ser igual para o mesmo product_idonde o language_idé 1.

Até agora, tentei a seguinte consulta, mas estou recebendo erros indicando que o MySQL não deseja atualizar uma tabela em que a tabela também está sendo usada na subconsulta.

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

Existe uma maneira "simples" de contornar essa limitação no MySQL? Ou algum "truque"? Estou um pouco surpreso que minha consulta não funcione, como parece lógico.

nathangiesbrecht
fonte

Respostas:

19

Este é um negócio bastante arriscado, e posso entender o porquê. Tem a ver com a maneira como o MySQL processa subconsultas. Eu escrevi sobre isso em 22 de fevereiro de 2011: Problema com a subconsulta do MySQL

Realizar JOINs envolvendo SELECTs e subconsulta SELECTs está OK. Por outro lado, UPDATEs e DELETE podem ser uma aventura bastante desafiadora à morte.

SUGESTÃO

Tente refatorar a consulta para que ela seja uma INNER JOIN de duas tabelas

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;

De uma chance !!!

RolandoMySQLDBA
fonte
0

Bem, isso não funcionou para mim, a atualização simplesmente não aconteceu, mesmo que houvesse linhas correspondentes. O que eu tive que fazer é criar a outra tabela como subconsulta para que o arquivo temporário seja usado.

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
fonte
-3
  1. Primeiro crie a tabela view / temp com a instrução select
  2. Executar consulta de atualização com junção interna
Sankar Kodali
fonte
2
Talvez você possa melhorar a resposta com algum código de exemplo?
precisa saber é o seguinte