項目中有用到這種類似的分表,如果要添加一個字段的話,該怎麼辦呢?
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,直接寫語句就行。