国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

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

2024-07-24 13:08:57
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了MySQL使用游標批量進行表操作,包括批量添加索引、批量添加字段等,感興趣的小伙伴們可以參考一下
 

一、概述

本章節介紹使用游標來批量進行表操作,包括批量添加索引、批量添加字段等。如果對存儲過程、變量定義、預處理還不是很熟悉先閱讀我前面寫過的關于這三個概念的文章,只有先了解了這三個概念才能更好的理解這篇文章。

二、正文

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來進行預編譯。

 總結

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



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 嵊州市| 枝江市| 宜良县| 阜平县| 株洲县| 三门峡市| 泸定县| 玉环县| 专栏| 平和县| 尼木县| 颍上县| 察隅县| 睢宁县| 鹤壁市| 横峰县| 海口市| 榕江县| 从化市| 新密市| 崇文区| 连平县| 莱芜市| 孟州市| 皋兰县| 东光县| 阜阳市| 安岳县| 泽普县| 西青区| 商河县| 芜湖县| 康平县| 邵阳县| 淮安市| 滦南县| 西充县| 酒泉市| 讷河市| 贺州市| 晋州市|