mysql创建存储过程实现往数据表中新增字段的方法分析
本文实例讲述了mysql创建存储过程实现往数据表中新增字段的方法。分享给大家供大家参考,具体如下:
需求:
往某数据库的某个表中新增一个字段(若该字段已存在,则不做操作;若该字段不存在,则新增)
百度了n久,没有符合要求的例子,只有参考加自己琢磨,最终终于给弄出来了,以下是几个版本的更迭
第一版:
DELIMITER$$ CREATEPROCEDUREinsert_column() BEGIN IFNOTEXISTS(SELECT1FROMinformation_schema.columns WHEREtable_schema='ltivalley'ANDtable_name='t_luck' ANDcolumn_name='sss')THEN altertableltivalley.t_luckaddsssvarchar(255)notNull; endif; END $$ DELIMITER;
此存储过程可以做到往ltivalley数据库的t_luck表中新增一个sss的字段,但写死了,毫无灵活性,故没用!
第二版:
DELIMITER$$
CREATEPROCEDUREinsert_column(indbnamevarchar(255),intbnamevarchar(255),incolnamevarchar(255))
set@sql_1=concat("IFNOTEXISTS(SELECT1FROM
information_schema.columnsWHEREtable_schema=",dbname,"
ANDtable_name=",tbname,"ANDcolumn_name=",colname,")
THEN
altertable",dbname,".",tbname,"add",colname,"
varchar(255)notnull;
endif;");
PREPAREstmtFROM@sql_1;
EXECUTEstmt;
DEALLOCATEPREPAREstmt;
END
$$
DELIMITER;
创建存储过程没有问题,但当调用的时候就会出错,报"IF"左右出错,原因是在mysql中IF只能存在于存储过程中,此处用EXECUTEstmt来执行,等于是不在存储过程里面执行if语句,所以报错,执行不了!故没用!
第三版
DELIMITER$$
CREATEPROCEDUREinsert_column(indbnamevarchar(255),intbnamevarchar(255),incolnamevarchar(255))
BEGIN
SET@selec=CONCAT('SELECT1FROMinformation_schema.columnsWHEREtable_schema="',dbname,'"ANDtable_name="',tbname,'"ANDcolumn_name="',colname,'"');
PREPAREselecFROM@selec;
SET@addcol=CONCAT('ALTERTABLE',dbname,'.',tbname,'ADD',colname,'VARCHAR(255)');
PREPAREaddcolFROM@addcol;
IFNOTEXISTS(EXECUTEselec;)THEN
EXECUTEaddcol;
ENDIF;
END
$$
DELIMITER;
无法创建存储过程,原因是在IFNOTEXISTS()中,不能执行EXECUTEselec语句,原因未知。故没用!
终极版
DROPPROCEDUREIFEXISTSinsert_column;
DELIMITER$$
CREATEPROCEDUREinsert_column(indbnamevarchar(255),intbnamevarchar(255),incolnamevarchar(255))
BEGIN
set@iscolexists=0;
SET@selec=CONCAT('SELECTcount(*)into@iscolexistsFROMinformation_schema.columnsWHEREtable_schema="',dbname,'"ANDtable_name="',tbname,'"ANDcolumn_name="',colname,'"');
PREPAREselecFROM@selec;
EXECUTEselec;
DEALLOCATEPREPAREselec;
SET@addcol=CONCAT('ALTERTABLE',dbname,'.',tbname,'ADD',colname,'VARCHAR(255)');
PREPAREaddcolFROM@addcol;
IF(@iscolexists=0)THEN
EXECUTEaddcol;
ENDIF;
END
$$
DELIMITER;
最终的结果,先执行EXECUTEselec,将结果存放到一个变量@iscolexists中,然后再在IF()中判断@iscolexists的值,做相应操作。可用!
更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL存储过程技巧大全》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》及《MySQL数据库锁相关技巧汇总》
希望本文所述对大家MySQL数据库计有所帮助。