mysql cursor loop to remove duplicate indexes

drop procedure if exists replicate_index;
CREATE DEFINER=`root`@`%` PROCEDURE `replicate_index`(IN p_table_schema VARCHAR(255),IN p_table_name VARCHAR(255),IN p_column_name VARCHAR(255))
BEGIN

-- 这个s  是系统自带的  可以判断select取出的list 是否已经空了
	DECLARE s int DEFAULT 0;

DECLARE p_indexName varchar(132);

DECLARE p_indexNames CURSOR FOR SELECT index_name FROM information_schema.statistics WHERE table_schema = p_table_schema and table_name = p_table_name and column_name = p_column_name;

-- 定义declare continue handler,这个会根据上下文是否有结果判断是否执行SET notfound = 1  这个不用看  是标准化的 系统会自动判断  如果集合里面空了  自动设置为1
 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s=1;

-- 使用select取出来的list  必须先open
	OPEN p_indexNames;

-- 赋值  从_test1_name集合里面取出一个值  赋值给_corpid
	FETCH p_indexNames INTO p_indexName;
	WHILE s <> 1  DO

	 -- DROP INDEX indexName ON organization_index;
 -- ALTER TABLE organization_index  DROP INDEX indexName;
 SET @STMT :=CONCAT("ALTER TABLE ",p_table_name," DROP index ",p_indexName,";");
			#SELECT @STMT;
PREPARE STMT FROM @STMT;
EXECUTE STMT;
DEALLOCATE PREPARE STMT;
FETCH p_indexNames INTO p_indexName;

END WHILE;
-- 关闭游标
CLOSE p_indexNames;

-- 新增该字段索引
SET @ADDINDEX :=CONCAT("ALTER TABLE ",p_table_name," ADD INDEX ",p_column_name,"_INDEX (",p_column_name,");");
PREPARE STMT FROM @ADDINDEX;
EXECUTE STMT;
END

Guess you like

Origin blog.csdn.net/qq_36836370/article/details/132280244