2012-03-31 13 views
4

Ich habe eine Reihe von Tabellen namens result_%, alle mit der gleichen Struktur.Abfrageergebnisse ausführen

Ich möchte diesen Tabellen einen Index hinzufügen.

kann ich die ALTER-Anweisung für jede Tabelle als eine Reihe von einer Auswahlabfrage Ergebnis bekommen, aber ich weiß nicht, wie diese Anweisungen auszuführen:

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_%'; 

Was bin ich?

Der Ausgang (was ich stattdessen ausführen möchte es mir nur noch angezeigt):

+---------------------------------------------------------+ 
| 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) 

[EDIT]

Ich habe versucht:

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(); 

aber noch keine Glück: Es ändert nur die letzte übereinstimmende Tabelle (results_gk_eng).

+0

könnten Sie versuchen, Prepare/execute-: http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html – zerkms

+0

Ich dachte auch, dass würde die Idee sein, aber nach dem Lesen der Dokumentation kann ich immer noch nicht herausfinden, wie man sie dafür benutzt. – NotGaeL

+0

Was ist das Problem? Schreiben Sie eine Prozedur, die über die Ergebnismenge iteriert und Zeile für Zeile ausführt – zerkms

Antwort

3

Sie im Grunde strings aus der DB ausdrucken, würde es nicht automatisch ausführen, nur weil es wie eine SQL-Anweisung aussieht;

Was Sie tun können, ist entweder eine Programmiersprache zu verwenden, um Zeile für Zeile auszuführen, wie Sie die Ergebnisse zurück erhalten.

Oder werfen Sie dies in eine gespeicherte Prozedur, wo es einen sekundären Ausführungsblock einspeist.

Beispiel: VON http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/ Lesen Sie mehr darüber.

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

Ich weiß, ich würde gerne wissen, ob es eine Möglichkeit gibt, mysql diese Ausgabe auszuführen, wie eine mysql-Prozedur, ohne zu einem externen Skript zu wiederholen. – NotGaeL

+1

Andere überhaupt keine Antwort: -S – zerkms

+0

@zerkms Ich glaube, das ist, was Sie als Kommentar geschrieben haben "Was ist das Problem? Schreiben Sie eine Prozedur, die über die Ergebnismenge iteriert und Zeile für Zeile ausführt" und wenn Sie tatsächlich lesen der Code, tut es genau das, mit der Ausnahme, dass es nicht genau die Alter-Anweisung ist, aber ich bin nicht hier, um seine Arbeit zu tun, sondern zeigen Sie ihm in die richtige Richtung. – Churk

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

Dies sollte die richtige Antwort sein, da es die OP-Frage beantwortet – Novastorm

Verwandte Themen