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

MySQL-fejl 1093 - Kan ikke angive måltabel til opdatering i FROM-klausulen

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.



  1. Ren måde at bruge postgresql vinduesfunktioner i django ORM?

  2. Sådan laver du dynamiske postgres-forberedte erklæringer i PHP

  3. Tvinge InnoDB til at gentjekke fremmednøgler på en tabel/tabeller?

  4. java.sql.SQLEundtagelse:- ORA-01000:maksimale åbne markører overskredet