sql >> Database >  >> RDS >> Mysql

Update MySQL-tabel in brokken

Ik kwam uit op de onderstaande procedure. Het werkt, maar ik weet niet zeker of het efficiënt is met alle zoekopdrachten om opeenvolgende bereiken te identificeren. Het kan worden aangeroepen met de volgende argumenten (voorbeeld):

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

Kortom, het eerste argument is het update-commando (bijvoorbeeld zoiets als "set x =..."), gevolgd door de mysql-tabelnaam, gevolgd door een numerieke (integer) sleutel die uniek moet zijn, gevolgd door de grootte van de stukjes te verwerken. De sleutel moet een index hebben voor redelijke prestaties. De variabele "n" en de "select"-instructies in de onderstaande code kunnen worden verwijderd en zijn alleen bedoeld voor foutopsporing.

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. Hoe haal je waarde uit de URL

  2. SQL-weergaven:hoe werk je met weergaven in SQL?

  3. Een database-e-mailprofiel (SSMS) bijwerken

  4. Datums ouder dan tijdstempel opslaan in PHP