MYSQL批量创建表的存储过程

因为业务需要,创建了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, ‘0‘),
    "(
  `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, ‘0‘));
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, ‘0‘),
    "(
  `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`;

原文地址:https://www.cnblogs.com/liaokaichang/p/8893135.html

时间: 2024-11-12 21:50:12

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

MySql数据库创建表

3.3.MySql数据库创建表 创建5个表: UserInfo用户基础表 Role 角色表 MenuInfo 菜单即控制表 Relation_Role_Menu 角色对应菜单关系表 RelaTion_User_Role  用户角色关系表 Depart 部门信息表 表名:USERINFO 用户信息表 序号 列名 数据类型 长度 小数位 标识 主键 允许空 默认值 说明 1 ID INT 是 否 主键 2 USER_NAME VARCHAR 100 是 用户姓名 3 USER_ID VARCHAR

Mysql 批量建表存储过程

最近项目中用到了使用存储过程批量建表的功能,记录下来: USE db_test_3; drop procedure if EXISTS `createTablesWithIndex`; create procedure createTablesWithIndex() BEGIN DECLARE `@i` int(11); DECLARE `@createSql` VARCHAR(2560); DECLARE `@createIndexSql1` VARCHAR(2560); DECLARE `@

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

修改表名 ALTER TABLE 原表名 RENAME TO 新表名; 一句SQL语句只能修改一张表 show tables; 1. SELECT CONCAT( 'ALTER TABLE ', table_name, ' RENAME TO db_', substring(table_name, 4), ';' ) FROM information_schema. TABLES WHERE table_name LIKE 'ct%'; 批量复制一下到Notepad++中,只保留sql语句,再复

Qt编译mysql以及创建表后进行导入操作

鉴于许多同学对Qt编译myql总是不能成功,出现各种问题,今天特此写出本教程,希望能够帮到需要的同学. 首先,需要明白编译的目的和原理. 目的:Qt 5.2版本以前都是不带mysql驱动的,所以需要进行编译mysql数据库驱动,只有编译完成后才能被Qt加载上.如果你安装的是Qt5.2以后版本的,那就不需要了,因为在后来的版本中,Qt官方增加这一模块. 可以在Qt的安装插件目录下查看自己的驱动是否已经存在.例如我的在目录: C:\Qt\4.8.2\plugins\sqldrivers.可以看到当前

mysql批量增加表中新列存储过程

一般访问量比较大的网站,请求日志表都是每天一张表独立创建. 业务需要为每张表都添加一个新列,纠结了半天,写了个存储过程如下: 日志表结构类型 tbl_ads_req_20140801,  tbl_ads_req_20140802 ... DELIMITER // create procedure sp2() begin declare sTime varchar(32); declare eTime varchar(32); declare sName varchar(128); declare

hibernate4连接mysql自动创建表之错误

我在学习Hibernate的过程中,遇到了这样一个错误:JUnit测试通过,但是数据库中却没有创建一个表,控制台的错误信息如下: HHH000388: Unsuccessful: create table t_user (user_id bigint not null auto_increment, card_number varchar(30), card_type varchar(20), company_name varchar(200), email varchar(100), gend

MYSQL定时创建表分区

一.存储过程-表分区-----------------------------------------------------------------需求: 每月创建一个分区 分区名名称格式:p201201,p201202……------------------------------------------ 1 CREATE DEFINER = `root`@`%` PROCEDURE `Auto_Create_Partition`(IN `databaseName` varchar(50),

MySQL批量删除表

overview 之前在工作中调试时建了一个每分钟执行一次的cron定时任务,每分钟均产生一个带时间信息的表名称,并忘了删除这个定时任务,待发现时已经有将近3000个新建的表了,由于单条单条地删除很慢,现需要批量删除这些带时间信息的表. theory&&measure theory 1 登陆mysql的information数据库,查找tables表,找出需要删除的表所在的数据库下的    所有符合时间要求的表名称 2 将查询出来的表名称拼接成drop table指令数据的形式,例如 dr

sql:MySQL 6.7 表,视图,存储过程结构查询

#数据库MySQL 6.7 use sakila; #查询表名 show tables; # SELECT TABLE_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='sakila'; select column_name from information_schema.columns where table_schema='sakila' and table_name='actor'; #表结构 字段名, 类