2012-03-31 107 views
4

我有一組名爲results_%的表,所有表都具有相同的結構。執行查詢結果語句

我想爲這個表添加一個索引。

我可以爲每個表的選擇查詢結果的行ALTER語句,但我不知道如何執行這個語句:

select concat('alter table ', test_db.table_name, ' add index `did` (`did`);') as statement 
from information_schema.tables test_db 
where test_db.table_name like 'results_%'; 

我缺少什麼?

的輸出中(我想執行的,而不是僅僅把它展示給我):

+---------------------------------------------------------+ 
| statement            | 
+---------------------------------------------------------+ 
| alter table results_Em7777_spa add index `did` (`did`); | 
| alter table results_KaEng_eng add index `did` (`did`); | 
| alter table results_Ka_spa add index `did` (`did`);  | 
| alter table results_Mc_spa add index `did` (`did`);  | 
| alter table results_Mo_eng add index `did` (`did`);  | 
| alter table results_Pe_eng add index `did` (`did`);  | 
| alter table results_SU_spa add index `did` (`did`);  | 
| alter table results_Ta_spa add index `did` (`did`);  | 
| alter table results_ba_eng add index `did` (`did`);  | 
| alter table results_br_eng add index `did` (`did`);  | 
| alter table results_ca_spa add index `did` (`did`);  | 
| alter table results_ch_spa add index `did` (`did`);  | 
| alter table results_da_spa add index `did` (`did`);  | 
| alter table results_ga_eng add index `did` (`did`);  | 
| alter table results_ge_spa add index `did` (`did`);  | 
| alter table results_gk_eng add index `did` (`did`);  | 
+---------------------------------------------------------+ 
16 rows in set (0.00 sec) 

[編輯]

我想:

drop procedure if exists altlike; 
delimiter // 
create procedure altlike() 
begin 
    set group_concat_max_len = 65535; 
    select @altrlk:= concat('alter table ', test_db.table_name , ' add index `did` (`did`);') 
    from information_schema.tables test_db 
    where test_db.table_name like "results_%"; 
    prepare statement from @altrlk; 
    execute statement; 
end // 
delimiter ; 
call altlike(); 

,但仍沒有運氣:它只會改變最後匹配的表格(results_gk_eng)。

+0

你可以嘗試準備/執行:http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html – zerkms 2012-03-31 12:16:04

+0

我還以爲會是想法,但在閱讀文檔後,我仍然無法弄清楚如何使用它們。 – NotGaeL 2012-03-31 12:29:59

+0

有什麼問題?編寫一個迭代結果集並逐行執行的程序 – zerkms 2012-03-31 12:32:05

回答

3

你基本上從數據庫中打印出一串字符串,它不會自動執行,因爲它看起來像一個sql語句;

您可以做的是使用編程語言逐行執行,以便返回結果。

或者把它放到一個存儲過程中,在那裏它提供了一個輔助執行塊。

例如:FROM http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/閱讀更多關於它的信息。

DELIMITER // 

CREATE PROCEDURE `proc_CURSOR` (OUT param1 INT) 
BEGIN 
    DECLARE a, b, c INT; 
    DECLARE cur1 CURSOR FOR SELECT col1 FROM table1; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1; 
    OPEN cur1; 

    SET b = 0; 
    SET c = 0; 

    WHILE b = 0 DO 
     FETCH cur1 INTO a; 
     IF b = 0 THEN 
      SET c = c + a; 
    END IF; 
    END WHILE; 

    CLOSE cur1; 
    SET param1 = c; 

END // 
+0

我知道,我想知道是否有一種方法告訴mysql執行此輸出,就像mysql過程,而不需要重複使用外部腳本。 – NotGaeL 2012-03-31 12:21:28

+1

另一個不是答案:-S – zerkms 2012-03-31 12:32:41

+0

@zerkms我相信這是你寫的評論「什麼問題?寫一個迭代結果集並逐行執行的過程」,如果你實際閱讀代碼,它的確如此,除了它不完全是改變陳述,但我不是在這裏做他的工作,而是指向正確的方向。 – Churk 2012-03-31 12:34:50

3
drop procedure if exists `altlike`; 
DELIMITER // 
CREATE PROCEDURE `altlike`() 
BEGIN 
    DECLARE a,c VARCHAR(256); 
    DECLARE b INT; 
    DECLARE cur1 CURSOR FOR select concat(test_db.table_name) 
    from information_schema.tables test_db 
    where test_db.table_name like 'results_%'; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1; 
    DECLARE CONTINUE HANDLER FOR 1061 SET b = 0; 
    OPEN cur1; 
    SET b = 0;  
    WHILE b = 0 DO 
    FETCH cur1 INTO a; 
    IF b = 0 THEN 
     SET @c = concat ('ALTER IGNORE TABLE `', a, '` ADD INDEX `did` (`did`)'); 
     PREPARE stmt1 FROM @c; 
     EXECUTE stmt1; 
     DEALLOCATE PREPARE stmt1; 
    END IF; 
    END WHILE; 
    CLOSE cur1;  
END // 
call altlike(); 
+0

這應該是正確的答案,因爲它回答OP的問題 – Novastorm 2017-08-09 11:06:08