Mysql数据库创建存储过程实现往数据表中新增字段的方法
2019-03-07 14:31:45
来源:
互联网
本文实例讲述了MySQL创建存储过程实现往数据表中新增字段的方法,结合实例形式对比分析了通过存储过程新增字段相关操作技巧,需要的朋友可以参考下。
需求:
往某数据库的某个表中新增一个字段(若该字段已存在,则不做操作;若该字段不存在,则新增)
百度了n久,没有符合要求的例子,只有参考加自己琢磨,最终终于给弄出来了,以下是几个版本的更迭
第一版:
DELIMITER $CREATEPROCEDUREinsert_column()BEGINIFNOTEXISTS(SELECT1FROMinformation_schema.columnsWHEREtable_schema='ltivalley'ANDtable_name='t_luck'ANDcolumn_name='sss')THENaltertableltivalley.t_luckaddsssvarchar(255)notNull;endif;END$DELIMITER ;
此存储过程可以做到往ltivalley数据库的t_luck表中新增一个sss的字段,但写死了,毫无灵活性,故没用!
第二版:
DELIMITER $CREATEPROCEDUREinsert_column(indbnamevarchar(255),intbnamevarchar(255),incolnamevarchar(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;");PREPAREstmtFROM@sql_1;EXECUTEstmt;DEALLOCATEPREPAREstmt;END$DELIMITER ;
创建存储过程没有问题,但当调用的时候就会出错,报 "IF"左右出错,原因是在mysql中IF只能存在于存储过程中,此处用EXECUTE stmt来执行,等于是不在存储过程里面执行if语句,所以报错,执行不了!故没用!
第三版
DELIMITER $CREATEPROCEDUREinsert_column(indbnamevarchar(255),intbnamevarchar(255),incolnamevarchar(255))BEGINSET@selec=CONCAT('SELECT 1 FROM information_schema.columns WHERE table_schema="',dbname,'" AND table_name="',tbname,'" AND column_name="',colname,'"');PREPAREselecFROM@selec;SET@addcol=CONCAT('ALTER TABLE ',dbname,'.',tbname,' ADD ',colname,' VARCHAR(255)');PREPAREaddcolFROM@addcol;IFNOTEXISTS(EXECUTEselec;)THENEXECUTEaddcol;ENDIF;END$DELIMITER ;
无法创建存储过程,原因是在IF NOT EXISTS()中,不能执行EXECUTE selec语句,原因未知。故没用!
终极版
DROPPROCEDUREIF EXISTS insert_column;DELIMITER $CREATEPROCEDUREinsert_column(indbnamevarchar(255),intbnamevarchar(255),incolnamevarchar(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,'"');PREPAREselecFROM@selec;EXECUTEselec;DEALLOCATEPREPAREselec;SET@addcol=CONCAT('ALTER TABLE ',dbname,'.',tbname,' ADD ',colname,' VARCHAR(255)');PREPAREaddcolFROM@addcol;IF(@iscolexists=0)THENEXECUTEaddcol;ENDIF;END$DELIMITER ;
最终的结果,先执行EXECUTE selec,将结果存放到一个变量@iscolexists中,然后再在IF()中判断@iscolexists的值,做相应操作。可用!
以上就是Mysql数据库创建存储过程实现往数据表中新增字段的方法的全部内容了,希望本文所述对大家MySQL数据库计有所帮助。
