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//