本文實(shí)例講述了mysql創(chuàng)建存儲過程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法。分享給大家供大家參考,具體如下:
需求:
往某數(shù)據(jù)庫的某個(gè)表中新增一個(gè)字段(若該字段已存在,則不做操作;若該字段不存在,則新增)
百度了n久,沒有符合要求的例子,只有參考加自己琢磨,最終終于給弄出來了,以下是幾個(gè)版本的更迭
第一版:
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數(shù)據(jù)庫的t_luck表中新增一個(gè)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 ;
創(chuàng)建存儲過程沒有問題,但當(dāng)調(diào)用的時(shí)候就會出錯(cuò),報(bào) "IF"左右出錯(cuò),原因是在mysql中IF只能存在于存儲過程中,此處用EXECUTE stmt來執(zhí)行,等于是不在存儲過程里面執(zhí)行if語句,所以報(bào)錯(cuò),執(zhí)行不了!故沒用!
第三版
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 ;
無法創(chuàng)建存儲過程,原因是在IF NOT EXISTS()中,不能執(zhí)行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 ;
最終的結(jié)果,先執(zhí)行EXECUTE selec
,將結(jié)果存放到一個(gè)變量@iscolexists
中,然后再在IF()
中判斷@iscolexists
的值,做相應(yīng)操作。可用!
希望本文所述對大家MySQL數(shù)據(jù)庫計(jì)有所幫助。
新聞熱點(diǎn)
疑難解答
圖片精選