《MYSQL數(shù)據(jù)庫MySQL使用游標(biāo)批量處理進(jìn)行表操作》要點(diǎn):
本文介紹了MYSQL數(shù)據(jù)庫MySQL使用游標(biāo)批量處理進(jìn)行表操作,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
MYSQL應(yīng)用一、概述
MYSQL應(yīng)用本章節(jié)介紹使用游標(biāo)來批量進(jìn)行表操作,包含批量添加索引、批量添加字段等.如果對(duì)存儲(chǔ)過程、變量定義、預(yù)處理還不是很熟悉先閱讀我前面寫過的關(guān)于這三個(gè)概念的文章,只有先了解了這三個(gè)概念才能更好的理解這篇文章.
MYSQL應(yīng)用理解MySQL變量和條件:/article/81375.htm
MYSQL應(yīng)用理解Mysql prepare預(yù)處理語句:/article/81378.htm
MYSQL應(yīng)用理解MySQL存儲(chǔ)過程和函數(shù):/article/81381.htm
MYSQL應(yīng)用二、正文
MYSQL應(yīng)用1、聲明光標(biāo)
MYSQL應(yīng)用
DECLARE cursor_name CURSOR FOR select_statement
MYSQL應(yīng)用這個(gè)語句聲明一個(gè)光標(biāo).也可以在子程序中定義多個(gè)光標(biāo),但是一個(gè)塊中的每一個(gè)光標(biāo)必需有唯一的名字.
MYSQL應(yīng)用注意:SELECT語句不能有INTO子句.
MYSQL應(yīng)用2、打開光標(biāo)
MYSQL應(yīng)用
DECLARE cursor_name CURSOR FOR select_statement
MYSQL應(yīng)用這個(gè)語句打開先前聲明的光標(biāo).
MYSQL應(yīng)用3、前進(jìn)光標(biāo)
MYSQL應(yīng)用
FETCH cursor_name INTO var_name [, var_name] ...
MYSQL應(yīng)用這個(gè)語句用指定的打開光標(biāo)讀取下一行(如果有下一行的話),并且前進(jìn)光標(biāo)指針.
MYSQL應(yīng)用4、關(guān)閉光標(biāo)
MYSQL應(yīng)用
CLOSE cursor_name
MYSQL應(yīng)用這個(gè)語句關(guān)閉先前打開的光標(biāo).
MYSQL應(yīng)用?5、批量添加索引
MYSQL應(yīng)用共享一個(gè)批量添加索引的游標(biāo),當(dāng)一個(gè)庫中有上百張表結(jié)構(gòu)一樣但是名稱不一樣的表,這個(gè)時(shí)候批量操作就變得簡單了.
MYSQL應(yīng)用
#刪除創(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();
MYSQL應(yīng)用這里有幾個(gè)細(xì)節(jié):
MYSQL應(yīng)用注意:由于mysql在存儲(chǔ)過程當(dāng)中無法將查詢出來的變量名直接作為表名來用,所以這里要用到動(dòng)態(tài)拼接SQL的辦法,但是通常的SET CONCAT的辦法并不管用,所以這里就使用了PREPARE來進(jìn)行預(yù)編譯.
MYSQL應(yīng)用?總結(jié)
MYSQL應(yīng)用?批量處理雖然有時(shí)候能提高工作的效率,但是帶來的潛在危險(xiǎn)也是挺大了,所以在執(zhí)行之前必需要非常有把握你執(zhí)行的語句對(duì)數(shù)據(jù)的影響,否則在生成環(huán)境就非常危險(xiǎn)了.
歡迎參與《MYSQL數(shù)據(jù)庫MySQL使用游標(biāo)批量處理進(jìn)行表操作》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/13964.html