Explicación de ASGBD, 19/12/2017

  • Visto en el libro MySQL Admin Cookbook, página 197 (208 del pdf):
Cuando queremos modificar grandes cantidades de datos, podemos bloquear otras consultas porque puede tardar un tiempo en completarse. Para ello, podemos utilizar un procedimiento para hacer que lo haga poco a poco y, así, liberar tiempo de espera para que se hagan consultas desde otros sitios.

(En el libro viene explicado en inglés.)

Explicación del procedimiento:
delimiter // /*Cambiamos de delimitador para añadir ; dentro del procedimiento */
CREATE PROCEDURE employees.delete_incrementally() /* Creación del procedimiento */
 MODIFIES SQL DATA /* Indica que se va a modificar datos en la base de datos */
 BEGIN
  REPEAT /* Repeat es un bucle do-while: Se asegura de que el bucle se haga una vez, 
            lo realiza y comprueba el bucle. */
   DELETE FROM employees.salaries /* Borrar de la base de datos */
   WHERE emp_no < 485000 /* Donde el el número de empleado sea menor que el dado*/
   LIMIT 20000; /* Y aquí está la magia: eliminaremos en bloques de 20.000 en 
                   20.000 para dar tiempo a otras consultas */
  UNTIL ROW_COUNT() = 0 END REPEAT; /* Condición para que termine el bucle, 
                                       hasta que, cuando haga la acción de borrar, 
                                       no borre nada.*/
 END // /* Fin del procedimiento */

delimiter ; /* Cambiamos el delimitador */

CALL employees.delete_incrementally(); /* Llamando a la función */