1、判断字段不存在则增加该字段
Talk is cheap, show me your code!
-- [新增]判断字段不存在则增加该字段
drop procedure if exists proc_add_column_unless_exist;
delimiter $$
create procedure proc_add_column_unless_exist(in var_table_name varchar(64),in var_column_name varchar(64),in var_sqlstr varchar(1024))
top:begin
-- 表不存在则直接返回
set @p_tablenum='';
set @sqlstr1=concat('select count(table_name)into @p_tablenum from information_schema.tables where table_schema=database() and table_name=\'',var_table_name,'\' limit 1;');
prepare stmt1 from @sqlstr1;
execute stmt1;
deallocate prepare stmt1;
if(@p_tablenum<1)then
leave top;
end if;
-- 字段已存在则直接返回
set @p_columnnum='';
set @sqlstr=concat('select count(column_name) into @p_columnnum from information_schema.columns where table_schema=database() and table_name=\'',var_table_name,'\'and column_name =\'',var_column_name,'\';');
prepare stmt2 from @sqlstr;
execute stmt2;
deallocate prepare stmt2;
if(@p_columnnum>0)then
leave top;
end if;
-- 表存在且字段不存在则创建新字段
set @sqlcmd=var_sqlstr;
prepare stmt3 from @sqlcmd;
execute stmt3;
deallocate prepare stmt3;
end $$
delimiter;
2、修改表字段的函数,有则修改,无则不修改
-- [新增]修改表字段的函数
drop procedure if exists proc_modify_column_unless_exist;
delimiter $$
create procedure proc_modify_column_unless_exist(in var_table_name varchar(64),in var_column_name varchar(64),in var_sqlstr varchar(1000))
top:begin
-- 表不存在则直接返回
set @p_tablenum='';
set @sqlstr1=concat('select count(table_name)into @p_tablenum from information_schema.tables where table_schema=database) and table name=\'',var_table_name, '\'limit 1;');
prepare stmt1 from @sqlstr1;
execute stmt1;
deallocate prepare stmt1;
if(@p_tablenum<1)then
leave top;
end if;
-- 字段不存在则直接返回
set @p_columnnum='';
set @sqlstr=concat('select count(column_name)into @p_columnnum from information_schema.columns where table_schema=database() and table_name=\'',var_table_name, '\'and column_name=\'',var_column_name,'\';');
prepare stmt2 from @sqlst;
execute stmt2;
deallocate prepare stmt2;
if(@p_columnnum <=0)then
leave top;
end if;
-- 表存在且字段存在则修改字段
set @sqlcmd=var_sqlstr;
prepare stmt3 from @sqlcmd;
execute stmt3;
deallocate prepare stmt3;
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 预编译 XXXEXECUTE
5、执行存储过程
CALL proc_drop_index ('mydb','t_emp');
6、函数和存储过程的区别?
- 功能方面:存储过程,功能强大,可以执行包括修改表等一系列数据库操作;函数功能简单。
- 返回数值:函数返回值有且只有一个;而存储过程可以返回多个或者没有返回值。存储过程的参数可以有IN,OUT,INOUT三种类型,而函数只能有IN类型。存储过程声明时不需要返回类型,而函数声明时需要描述返回类型,且函数体中必须包含一个有效的RETURN语句。
- 调用方面:存储过程一般是作为一个独立的部分来执行( EXECUTE 语句执行,CALL 调用),而函数可以作为查询语句的一个部分来调用(SELECT调用),由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。 SQL语句中不可用存储过程,而可以使用函数。