一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - MySQL使用游標批量處理進行表操作

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

2020-06-02 15:08pursuer.chen Mysql

這篇文章主要介紹了MySQL使用游標批量進行表操作,包括批量添加索引、批量添加字段等,感興趣的小伙伴們可以參考一下

一、概述

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

二、正文

1、聲明光標

?
1
DECLARE cursor_name CURSOR FOR select_statement

這個語句聲明一個光標。也可以在子程序中定義多個光標,但是一個塊中的每一個光標必須有唯一的名字。

注意:SELECT語句不能有INTO子句。

2、打開光標

?
1
DECLARE cursor_name CURSOR FOR select_statement

這個語句打開先前聲明的光標。

3、前進光標

?
1
FETCH cursor_name INTO var_name [, var_name] ...

這個語句用指定的打開光標讀取下一行(如果有下一行的話),并且前進光標指針。

4、關閉光標

?
1
CLOSE cursor_name

這個語句關閉先前打開的光標。

 5、批量添加索引

共享一個批量添加索引的游標,當一個庫中有上百張表結構一樣但是名稱不一樣的表,這個時候批量操作就變得簡單了。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#刪除創建存儲過程
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來進行預編譯。

 總結

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 黄瓜视频黄 | 亚洲va国产日韩欧美精品色婷婷 | 18成人在线观看 | 欧美特级特黄a大片免费 | 日本一级不卡一二三区免费 | 我的妹妹最近有点怪免费播放 | 日本久本草精品 | 国内体内she精视频免费 | 无码毛片内射白浆视频 | 色综合久久天天综合观看 | 国产精品香蕉在线观看不卡 | 久久久无码精品亚洲欧美 | 国产精品馆| 九九精品视频在线免费观看 | 天天视频国产精品 | 3d动漫美女被吸乳羞羞有 | 青草视频在线观看免费网站 | 国产亚洲综合成人91精品 | 国产乱子伦在线观看不卡 | 亚洲精品一区在线观看 | 香蕉国产人午夜视频在线 | 交换年轻夫妇HD中文字幕 | 美女gif跪趴式抽搐动态图 | 天天色视频 | 天码毛片一区二区三区入口 | 色多多视频在线 | 国产精品嫩草影院在线 | 国产一级在线免费观看 | 欧美3p大片在线观看完整版 | 国产香蕉97碰碰久久人人 | 国产精品欧美亚洲韩国日本 | 国产亚洲精品激情一区二区三区 | 欧美亚洲另类在线观看 | 国产亚洲99影院 | 成人久久18网站 | aaa毛片手机在线现看 | 免费观看一级特黄三大片视频 | 国产良心大作白丝精厕 | 日本三级在线观看免费 | 国产成人在线免费视频 | 处女摘花|