`
zhaoshijie
  • 浏览: 2242542 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

循环创建多张表 和 多个数据库sql语句(数据库水平分库分表时方便)

 
阅读更多
关键字:循环创建多张表 和 多个数据库sql语句(数据库水平分库分表时方便)
提示:创建库或表时可以用存储过程    删除库或表时也可以用存储过程  方便又省时

---------------------------------创建所有数据库-------------------------------------------
调用:call create_databases('znke_z_log_', 0, 128);
参数说明:
1、要创建的数据库前缀
2、目标数据库后缀最小数 
3、目标数据库后缀最大数(数据库总数量)

CREATE `create_databases`(IN db_pre VARCHAR(20),IN min_num INT,IN max_num INT)
BEGIN
     DECLARE i INT;
     DECLARE db_name VARCHAR(20);
     DECLARE sql_text VARCHAR(2000);
     SET i=min_num;
     SET db_name='';
     SET sql_text='';
     WHILE i<max_num DO
      SET db_name=CONCAT(db_pre,i);
     
      SET sql_text=CONCAT('CREATE DATABASE ', db_name, '' );
     
      SELECT sql_text;
      SET @sql_text=sql_text;
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
      SET i=i+1;
    END WHILE;

  END;

---------------------------------删除所有数据库-------------------------------------------
调用:call delete_databases('znke_z_log_', 0, 128);
参数说明:
1、要删除的数据库前缀
2、目标数据库后缀最小数 
3、目标数据库后缀最大数(数据库总数量)

CREATE `delete_databases`(IN db_pre VARCHAR(20),IN min_num INT,IN max_num INT)
BEGIN
     DECLARE i INT;
     DECLARE db_name VARCHAR(20); 
     DECLARE sql_text VARCHAR(2000);
     SET i=min_num;
     SET db_name='';
     SET sql_text='';
     WHILE i<max_num DO
      SET db_name=CONCAT(db_pre,i);
     
      SET sql_text=CONCAT('drop DATABASE ', db_name, '' );
       
      SELECT sql_text;
      SET @sql_text=sql_text;
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
      SET i=i+1;
    END WHILE;
END;


---------------------------------创建所有数据库中的表-------------------------------------------
调用:CALL create_tables_of_databases('znke_z_log_', 'log' ,'znke_z_log.log' ,0 , 128);
参数说明:
1、目标数据库的前缀 
2、要创建到目标数据库中的表名称
3、源数据库名称.源表名称(原理从已创建的库中复制,所以先要在源数据库中创建好设计好的表结构) 
4、目标数据库后缀最小数 
5、目标数据库后缀最大数(数据库总数量)
CREATE PROCEDURE `create_tables_of_databases`(IN db_pre VARCHAR(20),IN table_name VARCHAR(20),IN source_db_and_tableName VARCHAR(30),IN min_num INT,IN max_num INT)
BEGIN
     DECLARE i INT;
     DECLARE db_name VARCHAR(20);
    
     DECLARE sql_text VARCHAR(2000);
     SET i=min_num;
     SET db_name='';
    
     SET sql_text='';
     WHILE i<max_num DO
      SET db_name=CONCAT(db_pre,i);
     
     
      SET sql_text=CONCAT('create table ', db_name , '.' ,table_name ,' like ' ,source_db_and_tableName);
     
      SELECT sql_text;
      SET @sql_text=sql_text;
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
      SET i=i+1;
    END WHILE;
   
  END;
 
 
 
---------------------------------删除所有数据库中的表------------------------------------------- 
调用:CALL delete_tables_of_databases('znke_z_log_', 'log'  ,0 , 128);
参数说明:
1、目标数据库的前缀 
2、要创建到目标数据库中的表名称 
3、目标数据库后缀最小数 
4、目标数据库后缀最大数(数据库总数量)

CREATE PROCEDURE `delete_tables_of_databases`(IN db_pre VARCHAR(20),IN table_name VARCHAR(20),IN min_num INT,IN max_num INT)
BEGIN
     DECLARE i INT;
     DECLARE db_name VARCHAR(20);
    
     DECLARE sql_text VARCHAR(2000);
     SET i=min_num;
     SET db_name='';
    
     SET sql_text='';
     WHILE i<max_num DO
      SET db_name=CONCAT(db_pre,i);
     
     
      SET sql_text=CONCAT('drop table ', db_name , '.' ,table_name);
     
      SELECT sql_text;
      SET @sql_text=sql_text;
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
      SET i=i+1;
    END WHILE;
   
  END;


---------------------------------创建数据库中所有分表(单库多表 分片模式)-------------------------------------------
调用:call create_tables('alibaba_db', 'user_', 0 ,128);
参数说明:
1、目标数据库(在该数据库中建立很多分表) 
2、要创建到目标数据库中的表前缀 
3、目标数据库后缀最小数 
4、目标数据库后缀最大数(数据库总数量)
CREATE `create_tables`(IN db_name VARCHAR(20),IN table_pre VARCHAR(20), IN min_num INT,IN max_num INT)
BEGIN
     DECLARE i INT;
     DECLARE table_name VARCHAR(20);
     DECLARE sql_text VARCHAR(2000);
     SET i=min_num;
     SET table_name='';
     SET sql_text='';
     WHILE i<max_num DO
      SET table_name=CONCAT(table_pre,i);
     
      SET sql_text=CONCAT('CREATE TABLE ',db_name ,'.',table_name, '(
          id VARCHAR(32) NOT NULL,
          user_id VARCHAR(32),
          direction VARCHAR(8) ,
          operate_score INT(11),
          operator VARCHAR(32) ,
          operate_time DATETIME,
          score_status INT(4) ,
          score_rule_id VARCHAR(32) DEFAULT NULL ,
          member_level INT(4) DEFAULT NULL , 
          score_type INT(4) ,
          product_id VARCHAR(32) DEFAULT NULL ,
          remark VARCHAR(256) DEFAULT NULL ,
          operate_source INT(4) DEFAULT NULL ,
          gmt_modify DATETIME NOT NULL,
          gmt_create DATETIME NOT NULL,
          PRIMARY KEY (id)
        ) ENGINE=INNODB DEFAULT CHARSET=utf8' );
       
      SELECT sql_text;
      SET @sql_text=sql_text;
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
      SET i=i+1;
    END WHILE;
  END;

 
---------------------------------删除数据库中所有分表(单库多表 分片模式)-------------------------------------------
调用:call delete_tables('alibaba_db', 'user_', 0 ,128);
参数说明:
1、目标数据库(在该数据库中建立很多分表) 
2、要创建到目标数据库中的表前缀 
3、目标数据库后缀最小数 
4、目标数据库后缀最大数(数据库总数量)
CREATE `delete_tables`(IN db_name VARCHAR(20),IN table_pre VARCHAR(20), IN min_num INT,IN max_num INT)
BEGIN
     DECLARE i INT;
     DECLARE table_name VARCHAR(20);
     DECLARE sql_text VARCHAR(2000);
     SET i=min_num;
     SET table_name='';
     SET sql_text='';
     WHILE i<max_num DO
      SET table_name=CONCAT(table_pre,i);
     
      SET sql_text=CONCAT('drop table ', db_name , '.' ,table_name);
       
      SELECT sql_text;
      SET @sql_text=sql_text;
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
      SET i=i+1;
    END WHILE;
  END;
 
 
----------------------靓丽的分割线 结束---------------------------------------


============靓丽的分割线  以下为老版本 不可以动态传参数 仅供参考==============
-----------------------------MySQL动态创建多张表-----------------------------------------------
说明:1、修改SET table_pre='score_stream_' 为你需要的数据库名称前缀
  2、修改SET i=1 为你需要开始的数量后缀(最小后缀)
  3、修改WHILE i<16 为你最大的数量后缀(最大后缀)
 
call create_tables();

CREATE PROCEDURE `create_tables`()
  BEGIN
     DECLARE i INT;
     DECLARE table_name VARCHAR(20);
     DECLARE table_pre VARCHAR(20);
     DECLARE sql_text VARCHAR(2000);
     SET i=1;
     SET table_name='';
     SET table_pre='score_stream_';
     SET sql_text='';
     WHILE i<16 DO
      IF i<10 THEN SET table_name=CONCAT(table_pre,'0',i);
      ELSE SET table_name=CONCAT(table_pre,i);
      END IF;
     
      SET sql_text=CONCAT('CREATE TABLE ', table_name, '(
          id VARCHAR(32) NOT NULL,
          user_id VARCHAR(32),
          direction VARCHAR(8) ,
          operate_score INT(11),
          operator VARCHAR(32) ,
          operate_time DATETIME,
          score_status INT(4) ,
          score_rule_id VARCHAR(32) DEFAULT NULL ,
          member_level INT(4) DEFAULT NULL , 
          score_type INT(4) ,
          product_id VARCHAR(32) DEFAULT NULL ,
          remark VARCHAR(256) DEFAULT NULL ,
          operate_source INT(4) DEFAULT NULL ,
          gmt_modify DATETIME NOT NULL,
          gmt_create DATETIME NOT NULL,
          PRIMARY KEY (id)
        ) ENGINE=INNODB DEFAULT CHARSET=utf8' );
       
      SELECT sql_text;
      SET @sql_text=sql_text;
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
      SET i=i+1;
    END WHILE;
  END
 
 
 
 
 
 
 
 
-----------------------------MySQL动态创建多个数据库-----------------------------------------------
说明:1、修改SET table_pre='score_stream_' 为你需要的数据库名称前缀
  2、修改SET i=1 为你需要开始的数量后缀(最小后缀)
  3、修改WHILE i<16 为你最大的数量后缀(最大后缀)
call create_databases();

CREATE PROCEDURE `create_databases`()
  BEGIN
     DECLARE i INT;
     DECLARE table_name VARCHAR(20);
     DECLARE table_pre VARCHAR(20);
     DECLARE sql_text VARCHAR(2000);
     SET i=1;
     SET table_name='';
     SET table_pre='score_stream_';
     SET sql_text='';
     WHILE i<16 DO
      IF i<10 THEN SET table_name=CONCAT(table_pre,'0',i);
      ELSE SET table_name=CONCAT(table_pre,i);
      END IF;
     
      SET sql_text=CONCAT('CREATE DATABASE ', table_name, '' );
       
      SELECT sql_text;
      SET @sql_text=sql_text;
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
      SET i=i+1;
    END WHILE;
  END


-----------------------------MySQL动态删除多个数据库-----------------------------------------------
说明:具体参数可以根据情况调整
CREATE PROCEDURE `create_databases`()
BEGIN
     DECLARE i INT;
     DECLARE table_name VARCHAR(20);
     DECLARE table_pre VARCHAR(20);
     DECLARE sql_text VARCHAR(2000);
     SET i=1;
     SET table_name='';
     SET table_pre='score_stream_';
     SET sql_text='';
     WHILE i<16 DO
      IF i<10 THEN SET table_name=CONCAT(table_pre,'0',i);
      ELSE SET table_name=CONCAT(table_pre,i);
      END IF;
     
      SET sql_text=CONCAT('CREATE DATABASE ', table_name, '' );
       
      SELECT sql_text;
      SET @sql_text=sql_text;
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
      SET i=i+1;
    END WHILE;
  END;

-----------------------------MySQL动态删除多个数据表-----------------------------------------------
CREATE PROCEDURE `delete_tables`()
BEGIN
     DECLARE i INT;
     DECLARE table_name VARCHAR(20);
     DECLARE table_pre VARCHAR(20);
     DECLARE sql_text VARCHAR(2000);
     SET i=0;
     SET table_name='';
     SET table_pre='score_stream_';
     SET sql_text='';
     WHILE i<1024 DO
      SET table_name=CONCAT(table_pre,i);
     
      SET sql_text=CONCAT('drop TABLE ', table_name, '' );
       
      SELECT sql_text;
      SET @sql_text=sql_text;
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
      SET i=i+1;
    END WHILE;
  END;


---------------------------------OK创建所有数据库中的表-------------------------------------------
调用:CALL create_tables_of_databases2('znke_z_log_', 'log' ,'znke_z_log.log' ,0 , 128);
参数说明:1、目标数据库的前缀  2、要创建到目标数据库中的表名称 3、源数据库名称.源表名称  4、目标数据库后缀最小数  5、目标数据库后缀最大数(数据库总数量)
CREATE PROCEDURE `create_tables_of_databases2`(IN db_pre VARCHAR(20),IN table_name VARCHAR(20),IN source_db_and_tableName VARCHAR(30),IN min_num INT,IN max_num INT)
BEGIN
     DECLARE i INT;
     DECLARE db_name VARCHAR(20);
    
     DECLARE sql_text VARCHAR(2000);
     SET i=min_num;
     SET db_name='';
    
     SET sql_text='';
     WHILE i<max_num DO
      SET db_name=CONCAT(db_pre,i);
     
     
      SET sql_text=CONCAT('create table ', db_name , '.' ,table_name ,' like ' ,source_db_and_tableName);
     
      SELECT sql_text;
      SET @sql_text=sql_text;
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
      SET i=i+1;
    END WHILE;
   
  END;
 
---------------------------------OK删除所有数据库中的表------------------------------------------- 
调用:CALL delete_tables_of_databases('znke_z_log_', 'log'  ,0 , 128);
参数说明:1、目标数据库的前缀  2、要创建到目标数据库中的表名称  3、目标数据库后缀最小数  4、目标数据库后缀最大数(数据库总数量)

CREATE PROCEDURE `delete_tables_of_databases`(IN db_pre VARCHAR(20),IN table_name VARCHAR(20),IN min_num INT,IN max_num INT)
BEGIN
     DECLARE i INT;
     DECLARE db_name VARCHAR(20);
    
     DECLARE sql_text VARCHAR(2000);
     SET i=min_num;
     SET db_name='';
    
     SET sql_text='';
     WHILE i<max_num DO
      SET db_name=CONCAT(db_pre,i);
     
     
      SET sql_text=CONCAT('drop table ', db_name , '.' ,table_name);
     
      SELECT sql_text;
      SET @sql_text=sql_text;
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
      SET i=i+1;
    END WHILE;
   
  END;
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics