编程开发 --- sql存储过程批量创建表
-- 开始定义存储过程,使用定界符 $$ 以避免与默认的分号定界符冲突 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();