Mysql
 sql >> Database >  >> RDS >> Mysql

Errore MySQL 1093 - Impossibile specificare la tabella di destinazione per l'aggiornamento nella clausola FROM

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.