MySQL 使用存储过程批量建表

需求

建立 data_0 开始,到 data_9 共 10 张表,各表的字段结构、数据引擎、编码方式等均相同。

解决方案

使用如下存储过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
DELIMITER //
CREATE PROCEDURE create_table()
BEGIN
DECLARE `@i` INT(11);
DECLARE `@sqlstr` VARCHAR(2560);
SET `@i`=0;
WHILE `@i` < 10 DO
SET @sqlstr = CONCAT(
"CREATE TABLE data_",

`@i`,

"(
`ID` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`field1` VARCHAR(6) NOT NULL,
`field2` VARCHAR(10) NOT NULL,
`field3` VARCHAR(10) NOT NULL,
`field4` VARCHAR(10) NOT NULL,
`field5` VARCHAR(10) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 "
);
PREPARE stmt FROM @sqlstr;
EXECUTE stmt;

SET `@i` = `@i` + 1;
END WHILE;
END;

执行存储过程,执行后删除存储过程并恢复默认命令结束符:

1
2
3
CALL create_table();
DROP PROCEDURE create_table;
DELIMITER ;

注意事项

创建存储过程时,若采用命令行的方式,要先修改默认命令结束符,这样将 CREATE 到 END 之间的代码当是一条语句来执行。例如上述代码中的 DELIMITER //,将命令结束符修改为 //,执行结束后再修改回 ;