2017-05-26 56 views
0

這給我的查詢列表,我想執行:有沒有在MySQL的方式執行從INFORMATION_SCHEMA的結果集

select CONCAT('ALTER TABLE ',table_name,' DROP edit_time;') AS query FROM information_schema.COLUMNS where column_name = 'edit_time' AND table_schema = 'homestead'; 

結果:

|query| 
ALTER TABLE node_fields DROP edit_time; 
ALTER TABLE node_list_role DROP edit_time; 
ALTER TABLE node_list_versions DROP edit_time; 
ALTER TABLE node_lists DROP edit_time; 
.. (etc) .. 

這將返回所有的行我想放下該字段的表格。但是,有沒有辦法做這樣的事情:

EXECUTE {that query} 

FOREACH {results of that query} EXECUTE({that row}) 

我不知道MySQL的程序或邏輯語句很好,所以這是新的我。

+0

看到這個問題,它基本上是你需要的:https://stackoverflow.com/questions/999200/is-it-possible-to -execute -a-string-in-mysql – pilsetnieks

回答

0

將所有文本選擇到一個變量中,並使用它創建一個prepared statement,然後您可以執行該變量。請注意,準備好的聲明中不允許使用某些內容,其中可能包含您的表格修改。

編輯:正如@BerndBuffen在下面的評論中所提到的,您只能在準備好的語句中一次執行一個查詢。你會在結果集中的原始查詢的需要循環並執行它們一次一個 - 以下存儲過程應該做的伎倆:

DELIMITER $$ 
CREATE DEFINER=`somebody`@`%` PROCEDURE `test_proc`() 
BEGIN 

DECLARE done INT DEFAULT 0; 
DECLARE tname TEXT DEFAULT ""; 

DECLARE exec_cur CURSOR FOR 
    SELECT table_name 
    FROM information_schema.COLUMNS  
    WHERE column_name = 'edit_time' 
    AND table_schema = 'homestead' 
    ; 

DECLARE CONTINUE HANDLER 
FOR NOT FOUND SET done=1; 

OPEN exec_cur; 

exec_loop: LOOP 
    FETCH exec_cur INTO tname; 
    IF done THEN 
     LEAVE exec_loop; 
    END IF; 

    SET @cmd = CONCAT("ALTER TABLE ", tname, " DROP edit_time;"); 

    PREPARE stmt FROM @cmd; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 

END LOOP exec_loop; 

END$$ 
DELIMITER ; 

...或者只是複製的輸出行的原始查詢,將它們粘貼回客戶端,然後運行它們;-)

+0

@AC - 你只能執行1個查詢作爲預備語句 –

+0

@BerndBuffen是的,但是你可以在存儲過程中遍歷結果行,隨時創建並執行預處理語句 - 好點,但我會編輯它對於OP來說並不明顯 –

相關問題