本文共 1903 字,大约阅读时间需要 6 分钟。
业务数据量较大时,为了避免因遗忘配置而影响业务,许多数据库管理员会采用按月创建临时表的方式。这种表结构的特点是字段和索引完全一致,只有表名会根据月份动态变化。
event_scheduler。DELIMITER $$DROP PROCEDURE IF EXISTS `pro_autocre_month_table`$$CREATE DEFINER=`root`@`%` PROCEDURE `pro_autocre_month_table`()BEGIN DECLARE old_table_name VARCHAR(128); DECLARE new_table_name VARCHAR(128); DECLARE done INT DEFAULT 0; DECLARE table_cursor CURSOR FOR SELECT TABLE_NAME FROM `information_schema`.`TABLES` WHERE TABLE_SCHEMA = '目标数据库名称' AND TABLE_NAME REGEXP DATE_FORMAT(CURDATE(), '%Y%m'); DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; OPEN table_cursor; REPEAT FETCH table_cursor INTO old_table_name; IF NOT done THEN SET @sqlCmd = CONCAT('create table if not exists `', REPLACE(old_table_name, DATE_FORMAT(CURDATE(), '%Y%m'), DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 1 MONTH), '%Y%m')), '` like ''', old_table_name, '''); PREPARE preStmt FROM @sqlCmd; EXECUTE preStmt; END IF; UNTIL done END REPEAT; CLOSE table_cursor;END$$DELIMITER ; DELIMITER $$SET GLOBAL event_scheduler = ON$$CREATE EVENT `数据库名称`.`auto_create_table`ON SCHEDULE EVERY 1 WEEK STARTS '2014-01-01 00:00:00' ON COMPLETION NOT PRESERVE ENABLEDO BEGIN CALL `pro_autocre_month_table`();END$$DELIMITER ;
TABLE_SCHEMA = '目标数据库名称'中,请将目标数据库名称替换为实际所在数据库的名称。%Y%m:四位年份加两个月数DATE_ADD(CURDATE(), INTERVAL 1 MONTH):生成下个月的日期oracle和sql server等其他数据库,也可以通过类似的方式管理数据库表结构information_schema数据库的权限通过以上方法,可以有效管理数据库表结构,避免因配置遗漏而影响业务连续性。
转载地址:http://ifakz.baihongyu.com/