MySQL使用游標(biāo)批量處理進(jìn)行表操作
一、概述
本章節(jié)介紹使用游標(biāo)來批量進(jìn)行表操作,包括批量添加索引、批量添加字段等。如果對(duì)存儲(chǔ)過程、變量定義、預(yù)處理還不是很熟悉先閱讀我前面寫過的關(guān)于這三個(gè)概念的文章,只有先了解了這三個(gè)概念才能更好的理解這篇文章。
理解MySQL變量和條件:http://chabaoo.cn/article/81375.htm
理解Mysql prepare預(yù)處理語句:http://chabaoo.cn/article/81378.htm
理解MySQL存儲(chǔ)過程和函數(shù):http://chabaoo.cn/article/81381.htm
二、正文
1、聲明光標(biāo)
DECLARE cursor_name CURSOR FOR select_statement
這個(gè)語句聲明一個(gè)光標(biāo)。也可以在子程序中定義多個(gè)光標(biāo),但是一個(gè)塊中的每一個(gè)光標(biāo)必須有唯一的名字。
注意:SELECT語句不能有INTO子句。
2、打開光標(biāo)
DECLARE cursor_name CURSOR FOR select_statement
這個(gè)語句打開先前聲明的光標(biāo)。
3、前進(jìn)光標(biāo)
FETCH cursor_name INTO var_name [, var_name] ...
這個(gè)語句用指定的打開光標(biāo)讀取下一行(如果有下一行的話),并且前進(jìn)光標(biāo)指針。
4、關(guān)閉光標(biāo)
CLOSE cursor_name
這個(gè)語句關(guān)閉先前打開的光標(biāo)。
5、批量添加索引
共享一個(gè)批量添加索引的游標(biāo),當(dāng)一個(gè)庫中有上百張表結(jié)構(gòu)一樣但是名稱不一樣的表,這個(gè)時(shí)候批量操作就變得簡單了。
#刪除創(chuàng)建存儲(chǔ)過程 DROP PROCEDURE IF EXISTS FountTable; DELIMITER $$ CREATE PROCEDURE FountTable() BEGIN DECLARE TableName varchar(64); #聲明游標(biāo) 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; #打開游標(biāo) OPEN cur_FountTable; REPEAT FETCH cur_FountTable INTO TableName; #定義預(yù)處理 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; #關(guān)閉游標(biāo) CLOSE cur_FountTable; END $$ DELIMITER ; CALL FountTable();
這里有幾個(gè)細(xì)節(jié):
- 在聲明游標(biāo)的時(shí)候記得修改自己需要查詢的條件
- 在預(yù)處理這里也需要改成對(duì)應(yīng)的字段
- 在定義條件變量的時(shí)候這里我使用的是EXIT就是遇到錯(cuò)誤就中斷,當(dāng)然也可以使用CONTINUE 。
注意:由于mysql在存儲(chǔ)過程當(dāng)中無法將查詢出來的變量名直接作為表名來用,所以這里要用到動(dòng)態(tài)拼接SQL的方法,但是通常的SET CONCAT的方法并不管用,所以這里就使用了PREPARE來進(jìn)行預(yù)編譯。
總結(jié)
批量處理雖然有時(shí)候能提高工作的效率,但是帶來的潛在危險(xiǎn)也是挺大了,所以在執(zhí)行之前必須要非常有把握你執(zhí)行的語句對(duì)數(shù)據(jù)的影響,否則在生成環(huán)境就非常危險(xiǎn)了。
相關(guān)文章
mySQL中in查詢與exists查詢的區(qū)別小結(jié)
最近被一個(gè)朋友問到mySQL中in查詢和exists的區(qū)別,當(dāng)然只是草草的回答了下,今天偶然看到了一篇關(guān)于mysql中的exists查詢的文章,讀完感覺太”冷落”它了,這里總結(jié)一下,也跟自己常用的in查詢做一下對(duì)比。有需要的朋友們可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。2016-11-11MySQL 索引的優(yōu)缺點(diǎn)以及創(chuàng)建索引的準(zhǔn)則
這篇文章主要介紹了MySQL 索引的優(yōu)劣以及創(chuàng)建索引的準(zhǔn)則,幫助大家更好的理解和使用MySQL 索引,感興趣的朋友可以了解下2020-09-09詳解如何通過Mysql的二進(jìn)制日志恢復(fù)數(shù)據(jù)庫數(shù)據(jù)
本篇文章主要介紹了詳解如何通過Mysql的二進(jìn)制日志恢復(fù)數(shù)據(jù)庫數(shù)據(jù),具有一定的參考價(jià)值,有興趣的可以了解一下。2017-04-04解決MySQL安裝重裝時(shí)出現(xiàn)could not start the service mysql error:0問題的方法
這篇文章主要為大家詳細(xì)介紹了解決MySQL安裝重裝時(shí)出現(xiàn)could not start the service mysql error:0問題的方法,感興趣的小伙伴們可以參考一下2016-06-06mysql安全啟動(dòng)腳本mysqld_safe詳細(xì)介紹
這篇文章主要介紹了mysql安全啟動(dòng)腳本mysqld_safe詳細(xì)介紹,mysqld_safe增加了一些安全特性,需要的朋友可以參考下2014-07-07