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

时间:2021-05-24

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

需求:

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

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

第一版:

DELIMITER $$CREATE PROCEDURE insert_column()BEGINIF NOT EXISTS(SELECT 1 FROM information_schema.columnsWHERE table_schema='ltivalley' AND table_name='t_luck'AND column_name='sss' ) THENalter 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 FROMinformation_schema.columns WHERE table_schema=",dbname,"AND table_name=",tbname," AND column_name=",colname,")THENalter 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))BEGINSET @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;)THENEXECUTE 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))BEGINset @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)THENEXECUTE addcol;END IF;END$$DELIMITER ;

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

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

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

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章