資料庫經常會隨著時間的推移積累過時的數據,導致表膨脹和效能問題。為了有效管理此類數據,MySQL 提供了建立自動清理任務的預存程序的功能。
以下預存程序將自動刪除超過7 的行資料庫中所有資料表的天數:
DELIMITER $$ CREATE PROCEDURE delete_old_data() BEGIN DECLARE tb_name VARCHAR(255); DECLARE max_date DATE; SET max_date = DATE_SUB(NOW(), INTERVAL 7 DAY); SET tb_name = ( SELECT GROUP_CONCAT(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() ); CALL execute_delete_query(tb_name, max_date); END $$ DELIMITER ;
此預存程序初始化變數來儲存資料庫名稱、最大刪除日期和逗號分隔的表名清單。然後,它會呼叫輔助函數 (execute_delete_query) 來執行實際刪除。
CREATE FUNCTION execute_delete_query(tb_names VARCHAR(255), max_date DATE) RETURNS INTEGER BEGIN DECLARE tb_array [] VARCHAR(255); SET tb_array = SPLIT_STR(tb_names, ','); DECLARE i INT DEFAULT 1; DECLARE total_deleted INT DEFAULT 0; WHILE i <= SIZE(tb_array) DO SET @sql = CONCAT('DELETE FROM ', tb_array[i], ' WHERE update_timestamp < ''', max_date, '''); PREPARE stmt FROM @sql; EXECUTE stmt; SET total_deleted = total_deleted + ROW_COUNT(); DEALLOCATE PREPARE stmt; SET i = i + 1; END WHILE; RETURN total_deleted; END
輔助函數execute_delete_query 接受兩個參數:表名清單和最大值刪除日期。它遍歷表名,為每個表建立一個刪除查詢,並使用準備好的語句執行它。傳回已刪除行的總數。
要安排預存程序在每天00:00 自動執行,請依照下列步驟操作:
使用下列步驟操作:
CREATE EVENT delete_old_data_event ON SCHEDULE AT '00:00' EVERY 1 DAY DO CALL delete_old_data();
SET GLOBAL event_scheduler = ON;
以上是MySQL如何自動刪除7天前的行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!