-- 开始定义存储过程,使用定界符 $$ 以避免与默认的分号定界符冲突
DELIMITER $$
-- 创建名为 CreatePointRecordTables 的存储过程
CREATE PROCEDURE CreatePointRecordTables()
BEGIN
-- 初始化年份变量,从2024年开始
DECLARE v_year INT DEFAULT 2024;
-- 声明月份变量
DECLARE v_month INT;
-- 声明表名变量
DECLARE v_table_name VARCHAR(255);
-- 声明自增初始值变量,设置为19
DECLARE v_auto_increment_value BIGINT DEFAULT 19;
-- 外层循环,遍历年份,从2024到2033
WHILE v_year <= 2033 DO
-- 初始化月份变量,从1月开始
SET v_month = 1;
-- 内层循环,遍历每年的12个月
WHILE v_month <= 12 DO
-- 构造表名,如 pointrecord_202401
SET v_table_name = CONCAT('pointrecord_', v_year, LPAD(v_month, 2, '0'));
-- 动态构造 CREATE TABLE 语句
SET @sql = CONCAT('
CREATE TABLE `', v_table_name, '` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` VARCHAR(50) NULL DEFAULT NULL COMMENT ''用户id(与用户表关联)'' COLLATE ''utf8_unicode_ci'',
`point_sence` INT(11) NULL DEFAULT NULL COMMENT ''积分场景(与场景表关联)'',
`dept_id` INT(11) NULL DEFAULT NULL COMMENT ''部门id(与部门表关联)'',
`service_id` VARCHAR(50) NULL DEFAULT NULL COMMENT ''业务id'' COLLATE ''utf8_unicode_ci'',
`class_1_name` VARCHAR(50) NULL DEFAULT NULL COMMENT ''类型1'' COLLATE ''utf8_unicode_ci'',
`class_2_name` VARCHAR(50) NULL DEFAULT NULL COMMENT ''类型2'' COLLATE ''utf8_unicode_ci'',
`point_num` DOUBLE(22,2) NULL DEFAULT NULL COMMENT ''积分'',
`point_date` DATETIME NULL DEFAULT NULL COMMENT ''积分日期'',
PRIMARY KEY (`id`) USING BTREE
)
COMMENT=''1月积分表(已废弃 ,字段定义有问题,因为业务逻辑已经写好,其他表类似)''
COLLATE=''utf8_unicode_ci''
ENGINE=MyISAM
AUTO_INCREMENT=', v_auto_increment_value, ';
');
-- 准备执行动态构造的 SQL 语句
PREPARE stmt FROM @sql;
-- 执行准备好的 SQL 语句
EXECUTE stmt;
-- 释放准备好的语句
DEALLOCATE PREPARE stmt;
-- 将月份变量加1,继续下一个月
SET v_month = v_month + 1;
END WHILE;
-- 将年份变量加1,继续下一年
SET v_year = v_year + 1;
END WHILE;
END $$
-- 结束存储过程定义,并恢复定界符为默认的分号
DELIMITER ;
-- 调用存储过程,创建所有表
CALL CreatePointRecordTables();