Для правильного вопроса надо знать половину ответа
Транзакции тут не помогут, так как DROP TABLE/ALTER TABLE вызывают немедленный COMMIT.
Остаётся только менять саму процедуту обновления таблицы. Например так:
BEGIN TRANSACTION;
UPDATE `sh_prod_im` SET `updated` = 0;
Затем вставляем/обновляем строки:
INSERT
INTO `sh_prod_im` (`article`, ..., `updated`)
VALUES (:article, ..., 1)
ON DUPLICATE KEY UPDATE ..., `updated` = 1;
И удаляем необновлённые:
DELETE FROM `sh_prod_im` WHERE `updated` = 0;
COMMIT;
Для правильного вопроса надо знать половину ответа
А зачем нужна такая жуть?
SELECT IFNULL(SUM(`d`.`Population`), 250)
FROM `MDepartments` AS `d`
LEFT JOIN `Localities` AS `l` ON `l`.`Id` = `d`.`LocalityId`
WHERE `d`.`ParentId` = :Parent AND `Type` = 0;