sql >> Database >  >> RDS >> Mysql

Waarom werkt deze MySQL-update niet?

De query mislukt omdat u een tabel niet kunt wijzigen en uit diezelfde tabel in een subquery kunt selecteren.

Zie Subquerysyntaxis

Ik denk dat je dit kunt omzeilen met wat JOIN-trucs:

UPDATE meterreadings AS tgt
INNER JOIN (
  SELECT * FROM meterreadings
  WHERE meterreadingtype_id = 2
  ) AS src
ON tgt.meterreadingdate = src.meterreadingdate
   AND tgt.location_id = src.location_id
   AND tgt.created = src.created
   AND tgt.asset_id = src.asset_id
SET tgt.meterreading = src.meterreading

Ik ben geen MySQL-expert, maar ik geloof dat dit werkt omdat MySQL eerst de subquery verwerkt en het resultaat in het geheugen opslaat als een tijdelijke tabel, die niet verandert tijdens de UPDATE. Een neveneffect hiervan is dat als het resultaat van de subquery groot is, je een hoop geheugen opslokt (of te weinig hebt).

De enige manier (voor zover ik weet) om het geheugenprobleem te omzeilen, is door de subquery te verkleinen met behulp van criteria die niet direct gerelateerd zijn aan het updatedoel. Als u deze updates bijvoorbeeld zou doen als onderdeel van een nachtelijk proces, laat de innerlijke SELECT dan alleen rijen retourneren die in de afgelopen ~24 uur zijn gemaakt.




  1. Een database maken in Cloud Sites

  2. CSV-bestanden importeren en exporteren met PHP en MySQL

  3. Gratis webhosting met PHP-ondersteuning

  4. QMYSQL-stuurprogramma beschikbaar maar niet geladen