MySQL應用游標批量處置停止表操作。本站提示廣大學習愛好者:(MySQL應用游標批量處置停止表操作)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL應用游標批量處置停止表操作正文
1、概述
本章節引見應用游標來批量停止表操作,包含批量添加索引、批量添加字段等。假如對存儲進程、變量界說、預處置還不是很熟習先浏覽我後面寫過的關於這三個概念的文章,只要先懂得了這三個概念能力更好的懂得這篇文章。
懂得MySQL變量和前提:http://www.jb51.net/article/81375.htm
懂得Mysql prepare預處置語句:http://www.jb51.net/article/81378.htm
懂得MySQL存儲進程和函數:http://www.jb51.net/article/81381.htm
2、注釋
1、聲明光標
DECLARE cursor_name CURSOR FOR select_statement
這個語句聲明一個光標。也能夠在子法式中界說多個光標,然則一個塊中的每個光標必需有獨一的名字。
留意:SELECT語句不克不及有INTO子句。
2、翻開光標
DECLARE cursor_name CURSOR FOR select_statement
這個語句翻開先前聲明的光標。
3、進步光標
FETCH cursor_name INTO var_name [, var_name] ...
這個語句用指定的翻開光標讀取下一行(假如有下一行的話),而且進步光標指針。
4、封閉光標
CLOSE cursor_name
這個語句封閉先前翻開的光標。
5、批量添加索引
同享一個批量添加索引的游標,當一個庫中有上百張表構造一樣然則稱號紛歧樣的表,這個時刻批量操作就變得簡略了。
#刪除創立存儲進程 DROP PROCEDURE IF EXISTS FountTable; DELIMITER $$ CREATE PROCEDURE FountTable() BEGIN DECLARE TableName varchar(64); #聲明游標 DECLARE cur_FountTable CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA='front' AND TABLE_NAME LIKE 'student%'; DECLARE EXIT HANDLER FOR not found CLOSE cur_FountTable; #翻開游標 OPEN cur_FountTable; REPEAT FETCH cur_FountTable INTO TableName; #界說預處置 SET @SQLSTR1 = CONCAT('create index Flag on ','`',TableName,'`',' (Flag); '); SET @SQLSTR2 = CONCAT('create index State on ','`',TableName,'`',' (State); '); SET @SQLSTR3 = CONCAT('create index upload on ','`',TableName,'`',' (upload); '); SET @SQLSTR4 = CONCAT('create index ccFlag on ','`',TableName,'`',' (lockFlag); '); SET @SQLSTR5 = CONCAT('create index comes on ','`',TableName,'`',' (comes); '); ###SET @SQLSTR=CONCAT(@SQLSTR1,@SQLSTR2,@SQLSTR3,@SQLSTR4,@SQLSTR5 ); PREPARE STMT1 FROM @SQLSTR1; PREPARE STMT2 FROM @SQLSTR2; PREPARE STMT3 FROM @SQLSTR3; PREPARE STMT4 FROM @SQLSTR4; PREPARE STMT5 FROM @SQLSTR5; EXECUTE STMT1; EXECUTE STMT2; EXECUTE STMT3; EXECUTE STMT4; EXECUTE STMT5; DEALLOCATE PREPARE STMT1; DEALLOCATE PREPARE STMT2; DEALLOCATE PREPARE STMT3; DEALLOCATE PREPARE STMT4; DEALLOCATE PREPARE STMT5; # SELECT @SQLSTR; UNTIL 0 END REPEAT; #封閉游標 CLOSE cur_FountTable; END $$ DELIMITER ; CALL FountTable();
這裡有幾個細節:
留意:因為mysql在存儲進程傍邊沒法將查詢出來的變量名直接作為表名來用,所以這裡要用到靜態拼接SQL的辦法,然則平日的SET CONCAT的辦法其實不管用,所以這裡就應用了PREPARE來停止預編譯。
總結
批量處置固然有時刻能進步任務的效力,然則帶來的潛伏風險也是挺年夜了,所以在履行之前必需要異常有掌握你履行的語句對數據的影響,不然在生成情況就異常風險了。