sql >> Databasteknik >  >> RDS >> Mysql

MySQL-fel 1093 - Kan inte ange måltabell för uppdatering i FROM-satsen

Uppdatering:Det här svaret täcker den allmänna felklassificeringen. För ett mer specifikt svar om hur man bäst hanterar OP:s exakta fråga, se andra svar på denna fråga

I MySQL kan du inte ändra samma tabell som du använder i SELECT-delen.
Det här beteendet finns dokumenterat på:http://dev.mysql.com/doc/refman/5.6/en/update.html

Du kanske bara kan gå med i bordet för sig själv

Om logiken är enkel nog att omforma frågan, förlora underfrågan och sammanfoga tabellen med sig själv, med hjälp av lämpliga urvalskriterier. Detta kommer att få MySQL att se tabellen som två olika saker, vilket gör att destruktiva förändringar kan genomföras.

UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col

Alternativt kan du prova att kapsla underfrågan djupare i en from-sats ...

Om du absolut behöver underfrågan finns det en lösning, men det är lämpligt av flera skäl, inklusive prestanda:

UPDATE tbl SET col = (
  SELECT ... FROM (SELECT.... FROM) AS x);

Den kapslade underfrågan i FROM-satsen skapar en implicit temporarytable , så det räknas inte som samma tabell som du uppdaterar.

... men se upp för frågeoptimeraren

Tänk dock på att från MySQL 5.7 .6 och framåt kan optimeraren optimera underfrågan och fortfarande ge dig felet. Lyckligtvis är optimizer_switch variabel kan användas för att stänga av detta beteende; även om jag inte kunde rekommendera att göra detta som något mer än en kortsiktig lösning eller för små enstaka uppgifter.

SET optimizer_switch = 'derived_merge=off';

Tack till Peter V. Mørch för detta råd i kommentarerna.

Exempel på teknik kom från Baron Schwartz, ursprungligen publicerad på Nabble , parafraserad och utökad här.



  1. Python Anslut till MySQL-databas med MySQL Connector &PyMySQL-exempel

  2. Migrera PostgreSQL-databaser från on-prem till molnet med hjälp av AWS RDS

  3. Hur CHARSET() fungerar i MariaDB

  4. Sortering av arrayelement