存儲過程之新增或者刪除索引

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語句中不可用存儲過程,而可以使用函數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章