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

Hvorfor virker denne MySQL-opdatering ikke?

Forespørgslen mislykkes, fordi du ikke kan ændre en tabel og vælge fra den samme tabel i en underforespørgsel.

Se Underforespørgselssyntaks

Jeg tror, ​​du kan komme uden om dette med nogle JOIN-tricks:

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

Jeg er ingen MySQL-ekspert, men jeg tror, ​​det virker, fordi MySQL behandler underforespørgslen først og gemmer resultatet i hukommelsen som en midlertidig tabel, som ikke ændres under OPDATERING. En bivirkning af dette er, at hvis resultatet af underforespørgslen er stort, så vil du tygge et væld af (eller løbe tør for) hukommelse.

Den eneste måde (så vidt jeg ved) at komme uden om hukommelsesproblemet er at nedskære underforespørgslen ved at bruge kriterier, der ikke er direkte relateret til opdateringsmålet. Hvis du f.eks. skulle lave disse opdateringer som en del af en natlig proces, skal du få den indre SELECT til kun at returnere rækker, der er oprettet inden for de seneste ~24 timer.




  1. Forkert heltal (2147483647) er indsat i MySQL?

  2. Hvordan vælger man ORDER BY kolonne og RAND() begge?

  3. Indsættelse af PHP float/decimalværdier i MySQL

  4. Et første kig på den nye SQL Server Cardinality Estimator