mysql 循环批量建表(表结构相同,表名可以自定义)

摘要:
您可以根据MySQL for loop语句获取表名,也可以将表名放在游标中以获取循环游标中的值;因为在这里使用游标对我来说是最方便的,所以本文将使用游标来实现它。

1.情景展示

现在有这样一种需求:

我需要建两百多张表,这些表的表结构相同,表的名称也是提前拟定好的,必须使用指定的表名;

如果使用一个个写SQL语句,那不还得累死,所以,我想到了可不可以通过批量建表来实现?

2.原因分析

既然是只有表名不同,那我们只需要写好建表语句,中间的表名使用动态赋值的方式,for循环执行就可以了。

这就涉及到如何取值的问题?

你可以按照mysql的语句for循环取表名,也可以将表名放到游标里,循环游标取值;

由于我这里使用游标最方便,所以本文将使用游标来实现。

3.解决方案

需要使用:存储过程、游标、循环、SQL语句预处理。

建表语句分析:

我们先来回顾一下建表语句:create table 表名 (表字段...);

我们需要将表名使用变量来替代,也就是:create table variable_name (field...);

但是,建表语句,不识别变量,它只会将variable_name当成字符串,而不是变量来处理,也就是说,我们永远只能建一张表名为:variable_name的表。

那就只能使用最笨的方法:字符串拼接,即可,先将建表语句以字符串拼接的方式组装好,然后在执行。

查看代码
CREATE PROCEDURE create_table_batch()
BEGIN
  -- 该变量用于标识是否还有数据需遍历
	DECLARE
		var_flag INT DEFAULT 0;
	-- 创建一个变量用来存储遍历过程中的值
	DECLARE
		var_table_name VARCHAR ( 255 );
	-- 查询出需要遍历的数据集合
	DECLARE
		cur_table_name_list CURSOR FOR ( SELECT TABLENAME FROM meta_theme WHERE THEMETYPE = 2 );
	-- 查询是否有下一个数据,没有将标识设为1,相当于hasNext
	DECLARE
		CONTINUE HANDLER FOR NOT FOUND 
		SET var_flag = 1;
	-- 打开游标
	OPEN cur_table_name_list;
	-- 将游标中的值赋给定义好的变量(for循环的关键)
	-- 注意:当变量名与表的字段名相同时,游标fetch注入的变量为null,即使大小写不一致
	FETCH cur_table_name_list INTO var_table_name;
	-- 遍历未结束就一直执行
	WHILE
			var_flag != 1 DO
		-- targetSQL:for循环需要执行的核心代码
		/*DROP TABLE
		IF
			EXISTS var_table_name;
		CREATE TABLE var_table_name (
			ID BIGINT ( 20 ) NOT NULL AUTO_INCREMENT COMMENT '主键',
			DATAIDENTIFIER VARCHAR ( 255 ) COMMENT '数据元标识符',
			ENGLISHCODE VARCHAR ( 255 ) COMMENT '英文编码',
			CHINESENAME VARCHAR ( 255 ) COMMENT '中文名称',
			DEFINITION VARCHAR ( 255 ) COMMENT '定义',
			FIELDTYPE VARCHAR ( 255 ) COMMENT '字段类型',
			FIELDDESCRIPTION VARCHAR ( 255 ) COMMENT '字段说明',
			RANGCODE VARCHAR ( 255 ) COMMENT '值域代码',
			PRIMARY KEY ( ID ) USING BTREE 
		) ENGINE = INNODB CHARACTER 
		SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;*/
			 
        -- 局部变量必须以@作为前缀,声明方式用set
        -- 拼接建表SQL字符串,表名为变量
        SET @sqlstr = CONCAT( "CREATE TABLE ", var_table_name, " (
				ID bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
				DATAIDENTIFIER varchar(255) COMMENT '数据元标识符',
				ENGLISHCODE varchar(255) COMMENT '英文编码',
				CHINESENAME varchar(255) COMMENT '中文名称',
				DEFINITION varchar(255) COMMENT '定义',
				FIELDTYPE varchar(255) COMMENT '字段类型',
				FIELDDESCRIPTION varchar(255) COMMENT '字段说明',
				RANGCODE varchar(255) COMMENT '值域代码',
				PRIMARY KEY (ID) USING BTREE
				) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic
			" );
		-- mysql 预处理	SQL语句固定用法
		PREPARE stmt 
		FROM
			@sqlstr;
		EXECUTE stmt;
		-- 游标往后移一位(相当于C里面的指针)
		FETCH cur_table_name_list INTO var_table_name;
	-- 结束循环	
	END WHILE;
	-- 关闭游标
	CLOSE cur_table_name_list;
END

把该语句粘贴到Navicat的新建SQL窗口当中,将其作为SQL执行即可完成存储过程的创建;

mysql 循环批量建表(表结构相同,表名可以自定义)第1张

切换到函数窗口,找到该存储过程,双击打开;

mysql 循环批量建表(表结构相同,表名可以自定义)第2张

点击上图当中的“运行” 按钮,可以运行存储过程。

涵盖知识点:

存储过程用法;

变量及局部变量用法;

游标用法;

循环用法;

预处理SQL用法。

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

免责声明:文章转载自《mysql 循环批量建表(表结构相同,表名可以自定义)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇针对防止自己的Linux进程被杀死的解决办法Docker环境下自动更新Let’s Encrypt SSL证书下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql-connector-java与Mysql、Java的对应版本

转载自 https://blog.csdn.net/lingeio/article/details/93487770 mysql-connector-java与Mysql对应版本: MySQL Connector/J 8.0 is highly recommended for use with MySQL Server 8.0, 5.7, and 5.6...

mysql2es全量更新方案

mysql到es的全量更新方案可以通过 logstash来实现 logstash可以做基于全量的定时更新,也可以做基于时间的定时更新。 logstash的使用方式如下(本人用的是logstash-7.6.1,不同版本在使用上应该有细微区别,区别百度可解决) 1.https://artifacts.elastic.co/downloads/logstash/...

centos LNMP第一部分环境搭建 LAMP LNMP安装先后顺序 php安装 安装nginx 编写nginx启动脚本 懒汉模式 mv /usr/php/{p.conf.default,p.conf} php运行方式SAPI介绍 第二十三节课

centos  LNMP第一部分环境搭建 LAMP安装先后顺序  LNMP安装先后顺序 php安装 安装nginx  编写nginx启动脚本   懒汉模式  mv   /usr/local/php/{p.conf.default,p.conf}  php运行方式SAPI介绍  第二十三节课 推荐搜狐下载地址:http://mirrors.sohu.com/...

Azkaban简介和使用

概述 为什么需要工作流调度系统 l 一个完整的数据分析系统通常都是由大量任务单元组成: shell脚本程序,java程序,mapreduce程序、hive脚本等 l 各任务单元之间存在时间先后及前后依赖关系 l 为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行; 例如,我们可能有这样一个需求,某个业务系统每天产生20G原始数据,我们每天...

mysql存储过程 详细注释

原文:https://my.oschina.net/u/3582142/blog/1581929 delimiter $$ /* 重新定义mysql结束符,而不再是分号是结束符 */create procedure mergeDeclare() /* 创建存储过程 */BEGIN/*定义局部变量*/DECLARE id INT DEFAULT 0;DECL...

MySQL 5.7贴心参数之binlog_row_image

相信大家都了解mysql binlog的格式,那就是有三种,分别是STATEMENT,MiXED,ROW。各有优劣,具体的请大家自行查阅资料。在MySQL 5.7版本以前,虽然ROW格式有各种各样的好处。 1. 比如加快从库重放日志;ROW直接调用mysql的存储引擎接口(handler API) 来执行行的插入、删除和更新,完全跳过了mysql的优化器的...