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

2018-06-17 22:46:00来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

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

  

 

  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,直接写语句就行。


 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:关于mysql group_concat 不能显示为空的列的其他信息

下一篇:alter和alert的一些问题