MySQL使用遊標批量處理進行表操作_Mysql

來源:互聯網
上載者:User

一、概述

本章節介紹使用遊標來批量進行表操作,包括大量新增索引、大量新增欄位等。如果對預存程序、變數定義、預先處理還不是很熟悉先閱讀我前面寫過的關於這三個概念的文章,只有先瞭解了這三個概念才能更好的理解這篇文章。

理解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

二、本文

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

這裡有幾個細節:

  • 在聲明遊標的時候記得修改自己需要查詢的條件
  • 在預先處理這裡也需要改成對應的欄位
  • 在定義條件變數的時候這裡我使用的是EXIT就是遇到錯誤就中斷,當然也可以使用CONTINUE 。 

注意:由於mysql在預存程序當中無法將查詢出來的變數名直接作為表名來用,所以這裡要用到動態拼接SQL的方法,但是通常的SET CONCAT的方法並不管用,所以這裡就使用了PREPARE來進行先行編譯。

 總結

 批量處理雖然有時候能提高工作的效率,但是帶來的潛在危險也是挺大了,所以在執行之前必須要非常有把握你執行的語句對資料的影響,否則在產生環境就非常危險了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.