Aggiornamento:questa risposta copre la classificazione generale degli errori. Per una risposta più specifica su come gestire al meglio la query esatta dell'OP, vedere altre risposte a questa domanda
In MySQL, non puoi modificare la stessa tabella che usi nella parte SELECT.
Questo comportamento è documentato su:http://dev.mysql.com/doc/refman/5.6/en/update.html
Forse puoi semplicemente unirti al tavolo
Se la logica è abbastanza semplice da rimodellare la query, perdere la sottoquery e unire la tabella a se stessa, utilizzando criteri di selezione appropriati. Ciò farà sì che MySQL consideri la tabella come due cose diverse, consentendo l'esecuzione di modifiche distruttive.
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
In alternativa, prova a nidificare la sottoquery più in profondità in una clausola from ...
Se hai assolutamente bisogno della sottoquery, c'è una soluzione alternativa, ma è per diversi motivi, incluse le prestazioni:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
La sottoquery annidata nella clausola FROM crea un temporaneo implicito , quindi non conta come la stessa tabella che stai aggiornando.
... ma fai attenzione al Query Optimizer
Tuttavia, fai attenzione che da MySQL 5.7 .6
e in seguito, l'ottimizzatore può ottimizzare la sottoquery e continuare a darti l'errore. Fortunatamente, l'optimizer_switch
la variabile può essere utilizzata per disattivare questo comportamento; anche se non potrei raccomandare di farlo come qualcosa di più di una soluzione a breve termine o per piccole attività una tantum.
SET optimizer_switch = 'derived_merge=off';
Grazie a Peter V. Mørch per questo consiglio nei commenti.
La tecnica di esempio era del barone Schwartz, pubblicato originariamente su Nabble , qui parafrasato ed esteso.