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