sql >> Databáze >  >> RDS >> Mysql

Chyba MySQL 1093 - Nelze určit cílovou tabulku pro aktualizaci v klauzuli FROM

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.



  1. LIKE vs CONTAINS na SQL Server

  2. Fulltextové vyhledávání v MySQL:Hodný, zlý a ošklivý

  3. Jak vytvořit tabulku, pouze pokud v PostgreSQL neexistuje

  4. CROSS/OUTER APPLY v MySQL