sql >> Database >  >> RDS >> Mysql

MySQL-fout 1093 - Kan de doeltabel voor update niet specificeren in de FROM-clausule

Update:dit antwoord behandelt de algemene foutclassificatie. Voor een specifieker antwoord over hoe de exacte vraag van de OP het beste kan worden afgehandeld, zie andere antwoorden op deze vraag

In MySQL kunt u niet dezelfde tabel wijzigen die u in het SELECT-gedeelte gebruikt.
Dit gedrag is gedocumenteerd op:http://dev.mysql.com/doc/refman/5.6/en/update.html

Misschien kun je gewoon aan tafel voor zichzelf gaan

Als de logica eenvoudig genoeg is om de query opnieuw vorm te geven, verliest u de subquery en voegt u de tabel aan zichzelf toe, waarbij u de juiste selectiecriteria gebruikt. Hierdoor ziet MySQL de tabel als twee verschillende dingen, waardoor destructieve veranderingen kunnen plaatsvinden.

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

U kunt ook proberen de subquery dieper in een from-clausule te nesten ...

Als je de subquery absoluut nodig hebt, is er een tijdelijke oplossing, maar deze is om verschillende redenen, waaronder prestaties, lelijk:

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

De geneste subquery in de FROM-component creëert een impliciete tijdelijke tabel , dus het telt niet als dezelfde tabel die u bijwerkt.

... maar pas op voor de query-optimizer

Pas echter op dat van MySQL 5.7 .6 en verder kan de optimizer de subquery optimaliseren en u nog steeds de fout geven. Gelukkig is de optimizer_switch variabele kan worden gebruikt om dit gedrag uit te schakelen; hoewel ik dit niet kan aanbevelen als iets meer dan een kortetermijnoplossing of voor kleine eenmalige taken.

SET optimizer_switch = 'derived_merge=off';

Met dank aan Peter V. Mørch voor dit advies in de reacties.

Voorbeeldtechniek was van Baron Schwartz, oorspronkelijk gepubliceerd op Nabble , hier geparafraseerd en uitgebreid.



  1. Alternatief voor Intersect in MySQL

  2. Een overzicht van vertrouwde extensies in PostgreSQL 13

  3. Hoe gegevens van een tabel uit een andere database in SQL Server selecteren?

  4. hoe voeg ik superprivileges toe aan de mysql-database?