因为业务需要,创建了100个表,但是这些表的结构都是一样的,作为程序员,就是要解决这种重复劳动。然而这种事情还要单独写个php脚本的话太麻烦了吧,所以就干脆学了一下直接用Mysql存储过程怎么实现:

首先是创建表的:( LPAD(`@i`, 2, '0')的作用 是将1,2,3这些数字转化为'01','02','03')

DROP PROCEDURE IF EXISTS `create_tables`;

CREATE PROCEDURE create_tables ()
BEGIN DECLARE `@i` INT (11);
DECLARE `@createSql` VARCHAR (2560);SET `@i` = 0;
WHILE `@i` < 100 DO
-- 创建表
SET @createSql = CONCAT(
"CREATE TABLE IF NOT EXISTS guess_record",
LPAD(`@i`, 2, ''),
"(
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`userid` int(12) unsigned NOT NULL COMMENT '用户ID',
`issue` int(10) unsigned NOT NULL COMMENT '期号',
`options_id` int(10) unsigned NOT NULL COMMENT '选项ID',
`guess_time` int(10) unsigned NOT NULL COMMENT '答题时间',
`is_stat` tinyint(4) NOT NULL COMMENT '是否统计过',
PRIMARY KEY (`id`),
KEY `issue` (`issue`) USING BTREE,
KEY `userid` (`userid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
"
);
PREPARE stmt FROM @createSql;
EXECUTE stmt;
SET `@i` = `@i` + 1; END WHILE; END

然后是批量删除表的(嘿嘿,搞事情)

DROP PROCEDURE IF EXISTS `drop_tables`;

CREATE PROCEDURE drop_tables ()
BEGIN DECLARE `@i` INT (11);
DECLARE `@dropSql` VARCHAR (2560); SET `@i` = 0;
WHILE `@i` < 100 DO
-- 创建表
SET @dropSql = CONCAT("DROP TABLE IF EXISTS guess_record",LPAD(`@i`, 2, ''));
PREPARE stmt FROM @dropSql;
EXECUTE stmt;
SET `@i` = `@i` + 1; END WHILE; END

我用这个存储过程其实就是一次性的,所以完整的过程是 1、创建存储过程 2、执行存储过程(批量创建表)3、删除存储过程

#1:创建存储过程
DROP PROCEDURE IF EXISTS `create_tables`;
DELIMITER $$ //定义结束符
CREATE PROCEDURE create_tables ()
BEGIN DECLARE `@i` INT (11);
DECLARE `@createSql` VARCHAR (2560); SET `@i` = 0;
WHILE `@i` < 100 DO
-- 创建表
SET @createSql = CONCAT(
"CREATE TABLE IF NOT EXISTS guess_record",
LPAD(`@i`, 2, ''),
"(
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`userid` int(12) unsigned NOT NULL COMMENT '用户ID',
`issue` int(10) unsigned NOT NULL COMMENT '期号',
`options_id` int(10) unsigned NOT NULL COMMENT '选项ID',
`guess_time` int(10) unsigned NOT NULL COMMENT '答题时间',
`is_stat` tinyint(4) NOT NULL COMMENT '是否统计过',
PRIMARY KEY (`id`),
KEY `issue` (`issue`) USING BTREE,
KEY `userid` (`userid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
"
);
PREPARE stmt FROM @createSql;
EXECUTE stmt;
SET `@i` = `@i` + 1; END WHILE; END $$
DELIMITER ; //结束符改为;
#2:执行存储过程
CALL `create_tables`();
#3:删除存储过程
DROP PROCEDURE IF EXISTS `create_tables`;

MYSQL批量创建表的存储过程的更多相关文章

  1. mysql 批量创建表,利用存储过程

    最近根据需求,需要提前创建一批日志表,以日期结尾,每天创建一张,例如XXX20160530,请参考如下: BEGIN    DECLARE `sName` VARCHAR(128);   DECLAR ...

  2. mysql 批量创建表

    使用存储过程 BEGIN    DECLARE `@i` int(11);    DECLARE `@sqlstr` varchar(2560); SET `@i`=0; WHILE `@i` < ...

  3. MYSQL定时创建表分区

    MYSQL定时创建表分区 一.存储过程-表分区-----------------------------------------------------------------需求: 每月创建一个分区 ...

  4. 在SSMS里批量删除表、存储过程等各种对象

    在SSMS里批量删除表.存储过程等各种对象 以前想找批量删除表或者存储过程的方法,原来SSMS的GUI界面也可以完成 请看下图,因为这次出差的时候要删除所有的存储过程,然后重建这些存储过程 而表.函数 ...

  5. 利用sql批量删除表,存储过程

    利用sql批量删除表,存储过程. 最近用godaddy的空间,由于系统里面的表多,一个个的删除很麻烦,就网上搜集了一下解决方法. 给大家分享一下: 1.批量删除存储过程 declare @procNa ...

  6. mysql 在创建表或者插入时遇到关键字报错

    mysql 在创建表或者插入时遇到关键字:比如name,status等.都不报错 解决方法:在字段上加上` 上面这个符号是键盘ecs下面那个符号

  7. MySql数据库创建表

    3.3.MySql数据库创建表 创建5个表: UserInfo用户基础表 Role 角色表 MenuInfo 菜单即控制表 Relation_Role_Menu 角色对应菜单关系表 RelaTion_ ...

  8. Mysql 批量建表存储过程

    最近项目中用到了使用存储过程批量建表的功能,记录下来: USE db_test_3; drop procedure if EXISTS `createTablesWithIndex`; create ...

  9. MYSQL批量修改表前缀与表名sql语句

    修改表名 ALTER TABLE 原表名 RENAME TO 新表名; 一句SQL语句只能修改一张表 show tables; 1. SELECT CONCAT( 'ALTER TABLE ', ta ...

随机推荐

  1. code rain???

    Everybody loves the visual effect of the falling binary code known as ” Rain ” in The Matrix. In thi ...

  2. scrapy的使用-LinkExtractor

    背景: 在爬取网站信息是需要获取特定标签下的某些内容,就需要获取这些标签下的链接,如果获取每一个,在通过这个获取它下面的信息,这样效率会很低,时间复杂度O(n^2),但如果先获取链接,再获取内容,则时 ...

  3. 基于NEO4J的高级检索功能

    基于NEO4J的高级检索 一.需求 二.创建索引 1.索引自动更新配置 2.执行带有索引自动更新配置的过程 三.查询索引 1.LUCENE查询语法 2.实现高级检索的核心:LUCENE QUERY语句 ...

  4. 现代软件工程HW2:结对编程-生成五则运算式-Core10组 [PB16110698+PB16120162]

    作业具体要求点 这里 Core组要求: 1.Calc() 这个Calc 函数接受字符串的输入(字符串里就是算术表达式,例如 “5*3.5”,“7/8 - 3/8 ”,“3 + 90 * 0.3”等等) ...

  5. 读取数据库的数据并转换成List<>

    一.在有帮助类DbHelperSQL的时候 1.下为其中返回SqlDataReader的方法 /// <summary> /// 执行查询语句,返回SqlDataReader ( 注意:调 ...

  6. 数据库MySQL--联合查询

    应用场景:当要查询的结果来自多个表,且多个表没有直接的连接关系,但查询的信息一致时 语法: 查询语句1 union(all) 查询语句2 union(all) ..... 注:多条查询语句的查询列数要 ...

  7. Mysql ---Sqlserver数据迁移到Mysql(Mysql建表迁移数据)

    1 试用了MysqlWorkBench的数据迁移功能 以为能实现:建立跟Sqlserver一样的表结构和视图的功能,sqlserver的数据迁移到mysql 实际上发现:即使勾选了表和视图,实际上却只 ...

  8. MySQL回滚到某一时刻数据的方法

    MySQL回滚到某一时刻数据的方法       对于有归档日志的数据库来说,原理上都具备全库回滚到之前某一时刻的能力.在这方面最好用的Orale数据库,使用Oracle数据库的RMAN工具,可以方便的 ...

  9. 「STL」bitset正传

    前言 之前一些需要转二进制来解决的题目我看到很多大佬用了bitset. 然而我并不会这东西.看上去很高级的样子…… 改题改累了来学习一下233. 正文 一.bitset的构造 bitset有三种构造方 ...

  10. 线段树逆序对(偏序)——cf1187D好题!

    /* 排除掉所有不可能的情况,剩下的就是可行的 1.数的数量不相同 2.对任意一个区间进行排序,等价于可以交换任意逆序对, 那么从1到n扫描b数组,判断是否可以将a数组中等于b[i]的值所在的位置j交 ...