sql >> Databasteknik >  >> RDS >> Mysql

Uppdatera MySQL-tabellen i bitar

Jag slutade med proceduren nedan. Det fungerar men jag är inte säker på om det är effektivt med alla frågor för att identifiera på varandra följande intervall. Den kan anropas med följande argument (exempel):

call chunkUpdate('SET var=0','someTable','theKey',500000);

I grund och botten är det första argumentet uppdateringskommandot (t.ex. något som "set x =..."), följt av mysql-tabellnamnet, följt av en numerisk (heltals) nyckel som måste vara unik, följt av storleken på bitar som ska bearbetas. Nyckeln bör ha ett index för rimlig prestanda. Variabeln "n" och "select"-satserna i koden nedan kan tas bort och är endast avsedda för felsökning.

delimiter //
CREATE PROCEDURE chunkUpdate (IN cmd VARCHAR(255), IN tab VARCHAR(255), IN ky VARCHAR(255),IN sz INT)
BEGIN
  SET @sqlgetmin = CONCAT("SELECT MIN(",ky,")-1 INTO @minkey FROM ",tab); 
  SET @sqlgetmax = CONCAT("SELECT MAX(",ky,") INTO @maxkey FROM ( SELECT ",ky," FROM ",tab," WHERE ",ky,">@minkey ORDER BY ",ky," LIMIT ",sz,") AS TMP"); 
  SET @sqlstatement = CONCAT("UPDATE ",tab," ",cmd," WHERE ",ky,">@minkey AND ",ky,"<[email protected]");
  SET @n=1;

  PREPARE getmin from @sqlgetmin;
  PREPARE getmax from @sqlgetmax;
  PREPARE statement from @sqlstatement;

  EXECUTE getmin;

  REPEAT
    EXECUTE getmax; 
    SELECT cmd,@n AS step, @minkey AS min, @maxkey AS max;
    EXECUTE statement;
    set @[email protected];
    set @[email protected]+1;
  UNTIL @maxkey IS NULL
  END REPEAT; 
  select CONCAT(cmd, " EXECUTED IN ",@n," STEPS") AS MESSAGE;
END//



  1. Filtrera ett MySQL-resultat i Delphi

  2. Var ska jag förvara inloggningsuppgifterna för min databas?

  3. Django-formulär för att fråga databas (modeller)

  4. WHERE datumtid äldre än någon tid (t.ex. 15 minuter)