因为业务需要,创建了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. 20140308 std::fill

    std::fill  在[first, last)范围内填充值:std::fill(v.begin(), v.end(), 100);http://blog.csdn.net/ilysony/arti ...

  2. CSS如何让文字垂直居中?

    在说到这个问题的时候,也许有人会问CSS中不是有vertical-align属性来设置垂直居中的吗?即使是某些浏览器不支持我只需做少许的CSS Hack技术就可以啊!所以在这里我还要啰嗦两句,CSS中 ...

  3. Linux安全审计-基础篇

    安全审计这块我能想到的有两种方案可以解决,一种是在Linux中配置实现,一种是使用Python开发堡垒机实现,我先实现了第一种比较简单的:后面会开发堡垒机:   一.首先我们需要在/etc/profi ...

  4. Web前端开发必备手册(Cheat sheet)

    转自:http://blog.bingo929.com/cheat-sheets-for-web-develop.html Cheat sheet这个词组如果直译成中文,意思大概是”作弊小抄”之类的词 ...

  5. MySQL安装配置及测试

    1. 安装包下载 点击下载地址:https://dev.mysql.com/downloads/installer/打开页面,滑到较底端,按如下选择下载: 会弹出一个注册登录页面,可以不用管,直接点击 ...

  6. arm-linux-gcc 的使用

    1. 编译 C 文件,生成 elf 可执行文件 h1.c 源文件 #include <stdio.h> void hellofirst(void) { printf("The f ...

  7. 和Excel函数date同样功能的VBA函数DateSerial用法

    Sub 日期别()On Error Resume Nextlastrow = Sheets("运营日报").Range("a1048576").End(xlUp ...

  8. PHP算法之两数之和

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元 ...

  9. rem换算公式

    当前rem基准值=预设的基准值/设计稿宽度*当前设备的宽度

  10. 解决eclipse启动时出现“failed to load the jni shared library”

    如何解决启动eclipse出现failed to load the jni shared library的问题 问题描述:启动eclipse时,出现以下弹出框 此时,即表示eclispe和jdk位数不 ...