【发布时间】:2012-04-14 21:24:01
【问题描述】:
我有一组名为 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)。
【问题讨论】:
-
你可以试试 PREPARE/EXECUTE: dev.mysql.com/doc/refman/5.1/en/…
-
我也认为这是一个想法,但在阅读了文档后,我仍然无法弄清楚如何使用它们。
-
有什么问题?编写一个遍历结果集并逐行执行的过程
-
我什至没有运气尝试过:如果存在 altlike 则删除程序; delimiter // 创建过程 altlike(pattern varchar(128)) begin set group_concat_max_len = 65535; select @altrlk:= concat( 'alter table ', test_db.table_name , ' add index
did(did);' ) from information_schema.tables where test_db.table_name like pattern;准备来自@altrlk 的声明;执行语句;结束 // 分隔符 ;调用 altlike("results_%"); -
@altrlk:= concat(...语法非常错误。您需要从有关如何使用光标dev.mysql.com/doc/refman/5.1/en/cursors.html 的非常基础的知识开始