存储过程之新增或者删除索引

1、如果索引存在,则删除索引

-- [新增]如果索引存在,则删除索引
drop procedure if exists proc_del_index_if_exist;
delimiter $$
create procedure proc_del_index_if_exist(in p_tablename varchar(200),in p_idxname varchar(200))
begin
	declare currentdatabase varchar(64);
	select database() into currentdatabase;
	set @str_del = concat( 'alter table ', p_tablename ,' drop index ',p_idxname);
	if exists(select * from information_schema.statistics where table_schema=currentdatabase and table_name=p_tablename and index_name=p_idxname)
	then
		prepare stmt_del from @str_del;
		execute stmt_del;
		deallocate prepare stmt_del;
	end if;
end;
$$ delimiter;

 2、如果索引不存在,则新增索引

-- [新增]如果索引不存在,则新增索引
drop procedure if exists proc_add_index_unless_exist;
delimiter $$

create procedure proc_add_index_unless_exist(in p_tablename varchar(200),in p_idxname varchar (200))
begin
	declare currentdatabase varchar(64);
	select database() into currentdatabase;
	set @str_add=concat( 'alter table ',p_tablename,' add index ', p_idxname);
	if not exists(select *from information_schema.statistics where table_schema=currentdatabase and table_name=p_tablename and index_name=p_idxname)
	then
		prepare stmt_add from @str_add;
		execute stmt_add;
		deallocate prepare stmt_add;
	end if;
end;
$$
delimiter;

注:此方式使用的是add index硬编码,所以只能新增普通索引。 

3、增加索引(包括唯一索引)的函数

drop procedure if exists proc_add_unique_index_unless_exist;
delimiter $$

create procedure proc_add_unique_index_unless_exist(in var_table_name varchar(64),in var_index_name varchar(64),in var_sqlstr varchar(256))
begin
	set @v_indexname='';
	set @sqlstr=concat('select index_name into @v_indexname from information_schema.statistics where table_schema=database() and table_name=\'',var_table_name,'\'and index_name =\'',var_index_name,'\'limit 1;');
	prepare stmt1 from @sqlstr;
	execute stmt1;
	deallocate prepare stmt1;
	if (var_index_name<>@v_indexname)then
		set @sqlcmd=var_sqlstr;
	prepare stmt2 from @sqlcmd;
	execute stmt2;
	deallocate prepare stmt2;
end if;
end $$
delimiter;

知识点补充:

1、declare和set定义变量的区别?

declare(称为存储过程变量)定义的类似是局部变量,declare仅在方法中生效,即只在存储过程中的begin和end之间生效;,set(称为会话变量)定义的类似全局变量,,即这个变量可以在被调用的存储过程或者代码之间共享数据,变量面前必须加@符号(@是用户自定义变量,@@是系统定义变量)。

2、查出该表有哪些索引,索引名-->集合

SHOW INDEX FROM t_emp
元数据:meta DATA  描述数据的数据

SELECT index_name  FROM information_schema.STATISTICS WHERE table_name='t_emp' AND table_schema='mydb'
 AND index_name <>'PRIMARY' AND seq_in_index = 1

3、 如何循环集合

 CURSOR 游标
 FETCH xxx INTO xxx

4、如何让mysql执行一个字符串


PREPARE 预编译 XXX

EXECUTE

5、执行存储过程 

CALL proc_drop_index ('mydb','t_emp');

6、函数和存储过程的区别?

  • 功能方面:存储过程,功能强大,可以执行包括修改表等一系列数据库操作;函数功能简单。
  • 返回数值:函数返回值有且只有一个;而存储过程可以返回多个或者没有返回值。存储过程的参数可以有IN,OUT,INOUT三种类型,而函数只能有IN类型。存储过程声明时不需要返回类型,而函数声明时需要描述返回类型,且函数体中必须包含一个有效的RETURN语句。
  • 调用方面:存储过程一般是作为一个独立的部分来执行( EXECUTE 语句执行,CALL 调用),而函数可以作为查询语句的一个部分来调用(SELECT调用),由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。 SQL语句中不可用存储过程,而可以使用函数。
发布了491 篇原创文章 · 获赞 435 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/lixinkuan328/article/details/99666295