sql >> Databasteknik >  >> RDS >> Mysql

Varför fungerar inte den här MySQL-uppdateringen?

Frågan misslyckas eftersom du inte kan ändra en tabell och välja från samma tabell i en underfråga.

Se Syntax för undersökning

Jag tror att du kan komma runt detta med lite JOIN-trick:

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

Jag är ingen MySQL-expert, men jag tror att detta fungerar eftersom MySQL bearbetar underfrågan först och lagrar resultatet i minnet som en tillfällig tabell, som inte ändras under UPPDATERING. En bieffekt av detta är att om resultatet av underfrågan är stort, kommer du att tugga upp massor av (eller få slut på) minne.

Det enda sättet (såvitt jag vet) att komma runt minnesproblemet är att minska underfrågan med hjälp av kriterier som inte är direkt relaterade till uppdateringsmålet. Om du till exempel skulle göra dessa uppdateringar som en del av en nattlig process, gör du att de inre SELECT endast returnerar rader som skapats under de senaste ~24 timmarna.




  1. Returnera senaste ID (IDENTITET) På Infoga rad VB.NET MySQL

  2. Hur man skickar villkorssatser till en mySql-fråga

  3. (leverantör:Named Pipes Provider, fel:40 - Kunde inte öppna en anslutning till SQL Server)

  4. Hur producerar man fantomläsningar?