针对mysql中分表批量添加字段

  项目中有用到这种类似的分表,如果要添加一个字段的话,该怎么办呢?

  

 

  dba表示弄 一个脚本批量处理就行了,卧槽,这我哪会啊,于是硬着头皮又继续问dba,dba给一个脚本,一看是这样的。

  

 1 #!/bin/bash
 2 
 3 for db in {rmlog_bs_db_01,rmlog_bs_db_02,rmlog_bs_db_03,rmlog_bs_db_04,rmlog_bs_db_05,rmlog_bs_db_06,rmlog_bs_db_07,rmlog_bs_db_08,rmlog_bs_db_09,rmlog_bs_db_10,rmlog_bs_db_11,rmlog_bs_db_12
 4 ,rmlog_bs_db_13,rmlog_bs_db_14,rmlog_bs_db_15,rmlog_bs_db_16}
 5 do
 6 
 7 all_table=`/mysql/product/bin/mysql -uroot -pxxxxx -e "select table_name from information_schema.tables where table_schema='${db}' and table_name like  'log_imap_mail_2016%'"`
 8 
 9 for i in $all_table
10 do
11 
12 /mysql/product/bin/mysql -uroot -pxxxx -e "alter table $db.$i add xxxx"
13         done
14 done
View Code

  一看是个shell脚本,原来这不是分表,是特么批量建的表。

  我看这是个shell脚本,没法在我本机上测试,于是就想能不能搞个sql脚本。一开始以为像oracle一样,搞个执行体就行了,可是对mysql不是很熟,也没写过这玩意,于是上网查了很久。

  

drop procedure if exists useCursor;  
CREATE PROCEDURE useCursor()  
  BEGIN  
    DECLARE oneAddr varchar(8) default '';  
    DECLARE allAddr varchar(40) default '';  
    DECLARE done INT DEFAULT 0;  
    DECLARE curl CURSOR FOR select table_name from information_schema.tables where table_schema='testdb' and table_name like  'user%';  
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;  
    OPEN curl;  
    REPEAT  
      FETCH curl INTO oneAddr;  
      IF not done THEN  
         set @sql=concat('alter table ',oneAddr,' add comma varchar(10)');
         PREPARE stmt from @sql; 
         execute stmt;
      END IF;  
    UNTIL done END REPEAT;  
    select allAddr;
    CLOSE curl;     
  END;  
call useCursor(); 

  搞出来 这么个东西就行了,其中

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 这句表示select如果没有结果就set done为0.参数绑定试了用问号,但是不行,可能是我本机的mysql版本过低。只好拼接sql语句,这样总算可以了。


关于mysql中游标的循环,也一并写一下,一种是repeat,一种是while,一种是loop。还有执行体不用写begin end,直接写语句就行。


 

posted @ 2016-06-21 15:30  yy23  阅读(7532)  评论(0编辑  收藏  举报