本文實(shí)例講述了MySQL創(chuàng)建存儲(chǔ)過程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法,結(jié)合實(shí)例形式對(duì)比分析了通過存儲(chǔ)過程新增字段相關(guān)操作技巧,需要的朋友可以參考下。
需求:
往某數(shù)據(jù)庫(kù)的某個(gè)表中新增一個(gè)字段(若該字段已存在,則不做操作;若該字段不存在,則新增)
百度了n久,沒有符合要求的例子,只有參考加自己琢磨,最終終于給弄出來了,以下是幾個(gè)版本的更迭
第一版:
DELIMITER $CREATEPROCEDUREinsert_column()BEGINIFNOTEXISTS(SELECT1FROMinformation_schema.columnsWHEREtable_schema='ltivalley'ANDtable_name='t_luck'ANDcolumn_name='sss')THENaltertableltivalley.t_luckaddsssvarchar(255)notNull;endif;END$DELIMITER ;
此存儲(chǔ)過程可以做到往ltivalley數(shù)據(jù)庫(kù)的t_luck表中新增一個(gè)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 ;
創(chuàng)建存儲(chǔ)過程沒有問題,但當(dāng)調(diào)用的時(shí)候就會(huì)出錯(cuò),報(bào) "IF"左右出錯(cuò),原因是在mysql中IF只能存在于存儲(chǔ)過程中,此處用EXECUTE stmt來執(zhí)行,等于是不在存儲(chǔ)過程里面執(zhí)行if語句,所以報(bào)錯(cuò),執(zhí)行不了!故沒用!
第三版
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 ;
無法創(chuàng)建存儲(chǔ)過程,原因是在IF NOT EXISTS()中,不能執(zhí)行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 ;
最終的結(jié)果,先執(zhí)行EXECUTE selec,將結(jié)果存放到一個(gè)變量@iscolexists中,然后再在IF()中判斷@iscolexists的值,做相應(yīng)操作。可用!
以上就是Mysql數(shù)據(jù)庫(kù)創(chuàng)建存儲(chǔ)過程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法的全部?jī)?nèi)容了,希望本文所述對(duì)大家MySQL數(shù)據(jù)庫(kù)計(jì)有所幫助。
- Mysql數(shù)據(jù)庫(kù)自定義函數(shù)的定義、使用方法及操作注意事
- Mysql數(shù)據(jù)庫(kù)的max_allowed_packet設(shè)定方法
- Mysql數(shù)據(jù)庫(kù)亂碼出現(xiàn)的各個(gè)階段以及對(duì)應(yīng)方法
- MySQL數(shù)據(jù)庫(kù)的事務(wù)處理用法與實(shí)例代碼詳解
- Mysql數(shù)據(jù)庫(kù)使用from與join兩表查詢的方法區(qū)別總結(jié)
- Sql Server數(shù)據(jù)庫(kù)類似正則表達(dá)式的字符處理問題
- SQL Server數(shù)據(jù)庫(kù)中表和索引結(jié)構(gòu)存儲(chǔ)的原理及如何加快
- SQL Server Page數(shù)據(jù)庫(kù)結(jié)構(gòu)深入分析
- 基于Sql server數(shù)據(jù)庫(kù)的四種分頁(yè)方式總結(jié)
- SQL Server 2016數(shù)據(jù)庫(kù)快照代理過程詳解











