這篇文章主要介紹了mysql創建存儲過程實現往數據表中新增字段的方法,結合實例形式對比分析了通過存儲過程新增字段相關操作技巧,需要的朋友可以參考下
本文實例講述了mysql創建存儲過程實現往數據表中新增字段的方法。分享給大家供大家參考,具體如下:
需求:
往某數據庫的某個表中新增一個字段(若該字段已存在,則不做操作;若該字段不存在,則新增)
百度了n久,沒有符合要求的例子,只有參考加自己琢磨,最終終於給弄出來了,以下是幾個版本的更迭
第一版:
DELIMITER $$ CREATE PROCEDURE insert_column() BEGIN IF NOT EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema='ltivalley' AND table_name='t_luck' AND column_name='sss' ) THEN alter 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 FROM information_schema.columns WHERE table_schema=",dbname," AND table_name=",tbname," AND column_name=",colname,") THEN alter 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)) BEGIN SET @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;)THEN EXECUTE 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)) BEGIN set @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)THEN EXECUTE addcol; END IF; END $$ DELIMITER ;
最終的結果,先執行EXECUTE selec
,將結果存放到一個變量@iscolexists
中,然後再在IF()
中判斷@iscolexists
的值,做相應操作。可用!
更多關於MySQL相關內容感興趣的讀者可查看本站專題:《MySQL存儲過程技巧大全》、《MySQL常用函數大彙總》、《MySQL日誌操作技巧大全》、《MySQL事務操作技巧彙總》及《MySQL數據庫鎖相關技巧彙總》
希望本文所述對大家MySQL數據庫計有所幫助。