使用 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
完成。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。