DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`travel_doRecalc`() proc: BEGIN /** * Recounts the number of entries of changed travels. */ DECLARE vTravelFk INT; DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN DO RELEASE_LOCK('vn.ticket_doRecalc'); END; IF !GET_LOCK('vn.travel_doRecalc', 0) THEN LEAVE proc; END IF; CREATE OR REPLACE TEMPORARY TABLE tTravel ENGINE = MEMORY SELECT travelFk FROM travelRecalc; UPDATE travel t JOIN tTravel tt ON tt.travelFk = t.id SET t.totalEntries = ( SELECT COUNT(e.id) FROM entry e WHERE e.travelFk = t.id ); DELETE tr FROM travelRecalc tr JOIN tTravel t ON tr.travelFk = t.travelFk; DROP TEMPORARY TABLE tTravel; DO RELEASE_LOCK('vn.travel_doRecalc'); END$$ DELIMITER ;