mysql創(chuàng)建存儲過程實現(xiàn)往數(shù)據(jù)表中新增字段的方法分析
本文實例講述了mysql創(chuàng)建存儲過程實現(xiàn)往數(shù)據(jù)表中新增字段的方法。分享給大家供大家參考,具體如下:
需求:
往某數(shù)據(jù)庫的某個表中新增一個字段(若該字段已存在,則不做操作;若該字段不存在,則新增)
百度了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數(shù)據(jù)庫的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 ;
創(chuàng)建存儲過程沒有問題,但當(dāng)調(diào)用的時候就會出錯,報 "IF"左右出錯,原因是在mysql中IF只能存在于存儲過程中,此處用EXECUTE stmt來執(zhí)行,等于是不在存儲過程里面執(zhí)行if語句,所以報錯,執(zhí)行不了!故沒用!
第三版
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 ;
無法創(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))
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 ;
最終的結(jié)果,先執(zhí)行EXECUTE selec,將結(jié)果存放到一個變量@iscolexists中,然后再在IF()中判斷@iscolexists的值,做相應(yīng)操作??捎茫?/p>
更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL存儲過程技巧大全》、《MySQL常用函數(shù)大匯總》、《MySQL日志操作技巧大全》、《MySQL事務(wù)操作技巧匯總》及《MySQL數(shù)據(jù)庫鎖相關(guān)技巧匯總》
希望本文所述對大家MySQL數(shù)據(jù)庫計有所幫助。
- 詳解MySQL存儲過程的創(chuàng)建和調(diào)用
- mysql創(chuàng)建存儲過程及函數(shù)詳解
- MySQL之存儲過程按月創(chuàng)建表的方法步驟
- MySQL實現(xiàn)創(chuàng)建存儲過程并循環(huán)添加記錄的方法
- 在MySQL中創(chuàng)建帶有IN和OUT參數(shù)的存儲過程的方法
- 深入mysql創(chuàng)建自定義函數(shù)與存儲過程的詳解
- MySQL動態(tài)創(chuàng)建表,數(shù)據(jù)分表的存儲過程
- MySQL5創(chuàng)建存儲過程的示例
- 查看MySQL中已經(jīng)創(chuàng)建的存儲過程及其定義
相關(guān)文章
mysql存儲過程 游標(biāo) 循環(huán)使用介紹
今天分享下自己對于Mysql存儲過程的認識與了解,這里主要說說大家常用的游標(biāo)加循環(huán)的嵌套使用2012-11-11
MySQL事務(wù)的基礎(chǔ)學(xué)習(xí)以及心得分享
本篇內(nèi)容是關(guān)于MySQL事務(wù)的基礎(chǔ)知識學(xué)習(xí)內(nèi)容,并把學(xué)習(xí)中網(wǎng)友的心得做了總結(jié),分享給大家,一起學(xué)習(xí)參考下吧。2017-12-12
mysql使用教程之分區(qū)表的使用方法(刪除分區(qū)表)
mysql分區(qū)表使用方法,新增分區(qū)、刪除分區(qū)、分區(qū)的合并、分區(qū)的拆分等使用方法2013-12-12
Mysql?數(shù)據(jù)庫結(jié)構(gòu)及索引類型
這篇文章主要介紹了Mysql?數(shù)據(jù)庫結(jié)構(gòu)及索引類型,數(shù)據(jù)庫索引是?mysql?數(shù)據(jù)庫中重要的組成部分,是數(shù)據(jù)庫查詢數(shù)據(jù)速度提升的關(guān)鍵,本文將介紹數(shù)據(jù)庫索引的一些內(nèi)容,下文更多相關(guān)內(nèi)容,需要的小伙伴可以參考一下2022-05-05

