2012-03-31 103 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