Opdatering:Dette svar dækker den generelle fejlklassificering. For et mere specifikt svar om, hvordan man bedst håndterer OP's nøjagtige forespørgsel, se venligst andre svar på dette spørgsmål
I MySQL kan du ikke ændre den samme tabel, som du bruger i SELECT-delen.
Denne adfærd er dokumenteret på:http://dev.mysql.com/doc/refman/5.6/en/update.html
Måske kan du bare slutte dig til bordet for sig selv
Hvis logikken er enkel nok til at omforme forespørgslen, mister du underforespørgslen og forbinder tabellen med sig selv ved at bruge passende udvælgelseskriterier. Dette vil få MySQL til at se tabellen som to forskellige ting, hvilket tillader destruktive ændringer at fortsætte.
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
Alternativt kan du prøve at indlejre underforespørgslen dybere ind i en fra-klausul ...
Hvis du absolut har brug for underforespørgslen, er der en løsning, men det er nok af flere årsager, herunder ydeevne:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
Den indlejrede underforespørgsel i FROM-sætningen opretter en implicit midlertidig tabel , så det tæller ikke som den samme tabel, du opdaterer.
... men pas på forespørgselsoptimeringsværktøjet
Vær dog opmærksom på, at fra MySQL 5.7 .6
og fremefter kan optimeringsværktøjet optimere underforespørgslen og stadig give dig fejlen. Heldigvis er optimizer_switch
variabel kan bruges til at slå denne adfærd fra; selvom jeg ikke kunne anbefale at gøre dette som andet end en kortsigtet løsning eller til små enkeltstående opgaver.
SET optimizer_switch = 'derived_merge=off';
Tak til Peter V. Mørch for dette råd i kommentarerne.
Eksempel på teknik var fra Baron Schwartz, oprindeligt udgivet på Nabble , omskrevet og udvidet her.