在存储过程中使用MySQL的游标,对数据库所有的表添加索引。
CREATE DEFINER=`root`@`localhost` PROCEDURE `add_index`()
BEGIN
DECLARE strClear VARCHAR(500);
DECLARE done INT DEFAULT 0;
#定义游标
DECLARE curOne CURSOR FOR
SELECT CONCAT(" ALTER TABLE ",table_name," ADD INDEX time_idx (`create_time`); ") FROM information_schema.TABLES WHERE TABLE_SCHEMA = '数据库名称';
#绑定控制变量到游标,游标循环结束自动转为True
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
#打开游标
OPEN curOne;
#FETCH curOne INTO strClear;
REPEAT
FETCH curOne INTO strClear;
IF !done THEN
SELECT strClear;
#动态执行SQL语句
SET @mysql = strClear;
PREPARE stmt FROM @mysql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
UNTIL done = 1 END REPEAT;
#关闭游标
CLOSE curOne;
END
最后一条记录重复操作的原因:
最后一次通过循环遍历的时候,“fetch”是失败的,如果这个时候继续处理,会重复前一次的操作。