GKLBB

当你经历了暴风雨,你也就成为了暴风雨

导航

编程开发 --- 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();

 

posted on 2024-06-13 06:19  GKLBB  阅读(7)  评论(0编辑  收藏  举报