Алиса, я предполагаю, что вы используете соглашение об именах temp_1, temp_2, чтобы указать, что вы намерены удалить эти таблицы только через короткое время и что это не ВРЕМЕННЫЕ таблицы, как предполагает @ anton.
Несколько замечаний ab: из приведенного ниже примера:
Он написан как событие, но вы можете легко превратить его в процедуру, которая позволит вам передавать различные значения интервала или имя базы данных.
Вам нужно будет использовать курсор для извлечения имен таблиц и динамического SQL, чтобы подготовить и выполнить операторы для удаления таблиц и удаления записей в cached_tbl
.
Я сделал этонемного более сложный, чем строго необходимый, чтобы проиллюстрировать, как вы можете создать и заполнить таблицу TEMPORARY одним оператором, что было бы полезно, если бы вы превратили это в процедуру.Вы можете упростить его, объявив курсор как оператор в @ sql1 и удалив подготовку и выполнение в stmt1.
Возможно, вы хотите быть более ограничительным при выборе таблиц, в противном случае вы рискуете удалить cached_tbl
или другие таблицы базы данных случайно.
DELIMITER //
CREATE EVENT prune
ON SCHEDULE
EVERY 1 DAY
DO
BEGIN
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE tname VARCHAR(64);
DECLARE cur CURSOR FOR SELECT * FROM `tables_tmp`;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
SET @sql1 =
'CREATE TEMPORARY TABLE `tables_tmp`
SELECT `table_schema`,`table_name`
FROM `information_schema`.`tables`
WHERE `table_schema` = ''db''
AND `table_name` LIKE ''temp_%''
AND `create_time` < (NOW() - INTERVAL 1 DAY)';
PREPARE stmt1 FROM @sql1;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
OPEN cur;
myloop:LOOP
FETCH cur INTO tname;
IF done = TRUE THEN
LEAVE myloop;
END IF;
SET @sql2 = CONCAT('DROP TABLE IF EXISTS `db`.`', tname , '`;');
PREPARE stmt2 FROM @sql2;
EXECUTE stmt2;
DEALLOCATE PREPARE stmt2;
SET @sql3 = CONCAT('DELETE FROM `cached_tbl` WHERE `table_name` = ''', tname , ''';');
PREPARE stmt3 FROM @sql3;
EXECUTE stmt3;
DEALLOCATE PREPARE stmt3;
END LOOP;
END //
DELIMITER ;