mysql 儲存過程 procedure 批次建表

big_cat發表於2023-01-04

使用 procedure 批次建表。

有幾點大家需要注意:

prepare_stmt 指令只能使用 會話變數 來預準備 sql,無法使用 declare 宣告的 區域性變數
procedure 中的建立的 @會話變數 建議做清理,避免會話變數汙染。SET @foo = NULL; 即可。
DROP PROCEDURE IF EXISTS batchCreateTabPart;

DELIMITER $$

-- count 批次建表的數量
CREATE PROCEDURE batchCreateTabPart(IN count INT UNSIGNED)
BEGIN
    -- 儲存過程區域性變數定義
    DECLARE i INT UNSIGNED;
    DECLARE suffix VARCHAR(8);
    
    -- 區域性變數初始化
    SET i = 0;
    SET suffix = "";
    
    WHILE i < count DO
        IF i < 10 THEN
            SET suffix = CONCAT("0", i);
        ELSE
            SET suffix = i;
        END IF;
                
        SET @dropSql = CONCAT('DROP TABLE IF EXISTS `tb_part_', suffix, '`;');
        PREPARE stmt FROM @dropSql;
        EXECUTE stmt;
        
        -- 拼接建立表 ddl
        SET @createSql = CONCAT('CREATE TABLE IF NOT EXISTS `tb_part_', suffix, "`(
        `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        `name` varchar(32) NOT NULL COMMENT '使用者名稱',
        `age` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT '年齡',
        `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
        `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
        )ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='分表示例';");
        PREPARE stmt FROM @createSql;
        EXECUTE stmt;
                    
        SET i = i + 1;
    END WHILE;
    
    -- 刪除過程中定義的使用者會話變數
    SET @dropSql = NULL;
    SET @createSql = NULL;
END $$

DELIMITER ;

CALL batchCreateTabPart(100);

DROP PROCEDURE IF EXISTS batchCreateTabPart;

tab_part_00
tab_part_01
...
tab_part_10
...
tab_part_99

完成。

相關文章