欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

mysql创建存储过程实现往数据表中新增字段的方法分析

程序员文章站 2022-03-09 14:31:13
本文实例讲述了mysql创建存储过程实现往数据表中新增字段的方法。分享给大家供大家参考,具体如下: 需求: 往某数据库的某个表中新增一个字段(若该字段已存在,则不做操作...

本文实例讲述了mysql创建存储过程实现往数据表中新增字段的方法。分享给大家供大家参考,具体如下:

需求:

往某数据库的某个表中新增一个字段(若该字段已存在,则不做操作;若该字段不存在,则新增)

百度了n久,没有符合要求的例子,只有参考加自己琢磨,最终终于给弄出来了,以下是几个版本的更迭

第一版:

delimiter $$
create procedure insert_column()
begin
if not exists(select 1 from information_schema.columns
where table_schema='ltivalley' and table_name='t_luck'
and column_name='sss' ) then
alter table ltivalley.t_luck add sss varchar(255) not null;
end if;
end
$$
delimiter ;

此存储过程可以做到往ltivalley数据库的t_luck表中新增一个sss的字段,但写死了,毫无灵活性,故没用!

第二版:

delimiter $$
create procedure insert_column(in dbname varchar(255),in tbname varchar(255),in colname varchar(255))
set @sql_1= concat("if not exists(select 1 from
information_schema.columns where table_schema=",dbname,"
and table_name=",tbname," and column_name=",colname,")
then
alter table ",dbname,".",tbname," add ",colname,"
varchar(255) not null;
end if;");
prepare stmt from @sql_1;
execute stmt;
deallocate prepare stmt;
end
$$
delimiter ;

创建存储过程没有问题,但当调用的时候就会出错,报 "if"左右出错,原因是在mysql中if只能存在于存储过程中,此处用execute stmt来执行,等于是不在存储过程里面执行if语句,所以报错,执行不了!故没用!

第三版

delimiter $$
create procedure insert_column(in dbname varchar(255),in tbname varchar(255),in colname varchar(255))
begin
set @selec=concat('select 1 from information_schema.columns where table_schema="',dbname,'" and table_name="',tbname,'" and column_name="',colname,'"');
prepare selec from @selec;
set @addcol=concat('alter table ',dbname,'.',tbname,' add ',colname,' varchar(255)');
prepare addcol from @addcol;
if not exists(execute selec;)then
execute addcol;
end if;
end
$$
delimiter ;

无法创建存储过程,原因是在if not exists()中,不能执行execute selec语句,原因未知。故没用!

终极版

drop procedure if exists insert_column;
delimiter $$
create procedure insert_column(in dbname varchar(255),in tbname varchar(255),in colname varchar(255))
begin
set @iscolexists = 0;
set @selec=concat('select count(*) into @iscolexists from information_schema.columns where table_schema="',dbname,'" and table_name="',tbname,'" and column_name="',colname,'"');
prepare selec from @selec;
execute selec;
deallocate prepare selec;
set @addcol=concat('alter table ',dbname,'.',tbname,' add ',colname,' varchar(255)');
prepare addcol from @addcol;
if(@iscolexists=0)then
execute addcol;
end if;
end
$$
delimiter ;

最终的结果,先执行execute selec,将结果存放到一个变量@iscolexists中,然后再在if()中判断@iscolexists的值,做相应操作。可用!

更多关于mysql相关内容感兴趣的读者可查看本站专题:《mysql存储过程技巧大全》、《mysql常用函数大汇总》、《mysql日志操作技巧大全》、《mysql事务操作技巧汇总》及《mysql数据库锁相关技巧汇总

希望本文所述对大家mysql数据库计有所帮助。