Aktualizace:Tato odpověď pokrývá obecnou klasifikaci chyb. Podrobnější odpověď na to, jak nejlépe zpracovat přesný dotaz OP, naleznete v dalších odpovědích na tuto otázku
V MySQL nemůžete upravit stejnou tabulku, jakou používáte v části SELECT.
Toto chování je zdokumentováno na:http://dev.mysql.com/doc/refman/5.6/en/update.html
Možná se ke stolu můžete připojit sami
Pokud je logika dostatečně jednoduchá na to, aby přetvořila dotaz, ztraťte poddotaz a připojte tabulku k sobě pomocí vhodných výběrových kritérií. To způsobí, že MySQL bude vidět tabulku jako dvě různé věci, což umožní pokračovat v destruktivních změnách.
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
Případně zkuste vnořit poddotaz hlouběji do klauzule from ...
Pokud poddotaz nezbytně potřebujete, existuje řešení, které je však nevhodné z několika důvodů, včetně výkonu:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
Vnořený poddotaz v klauzuli FROM vytvoří implicitní dočasný soubor , takže se to nepočítá jako stejná tabulka, kterou aktualizujete.
... ale pozor na optimalizátor dotazů
Dejte si však pozor, že z MySQL 5.7 .6
a dále může optimalizátor optimalizovat poddotaz a přesto vám zobrazí chybu. Naštěstí optimizer_switch
proměnnou lze toto chování vypnout; i když jsem nemohl doporučit udělat to jako něco víc než krátkodobou opravu nebo pro malé jednorázové úkoly.
SET optimizer_switch = 'derived_merge=off';
Děkujeme Peter V. Mørch za tuto radu v komentářích.
Příklad techniky byl od barona Schwartze, původně publikováno na Nabble , zde parafrázováno a rozšířeno.