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)操作。可用!
更多關(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 8.0數(shù)據(jù)字典緩存管理機制解析
MySQL 8.0中的數(shù)據(jù)字典,通過對兩級緩存的逐級訪問,以及精妙的對緩存未命中情況的處理方式,有效的加速了在不同場景下數(shù)據(jù)庫對DD的訪問速度,顯著的提升了數(shù)據(jù)庫訪問元數(shù)據(jù)信息的效率,這篇文章主要介紹了解讀MySQL 8.0數(shù)據(jù)字典緩存管理機制,需要的朋友可以參考下2024-07-07mysql分頁時offset過大的Sql優(yōu)化經(jīng)驗分享
mysql分頁是我們在開發(fā)經(jīng)常遇到的一個功能,最近在實現(xiàn)該功能的時候遇到一個問題,所以這篇文章主要給大家介紹了關(guān)于mysql分頁時offset過大的Sql優(yōu)化經(jīng)驗,文中介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起看看吧。2017-08-08MySQL學(xué)習(xí)第六天 學(xué)習(xí)MySQL基本數(shù)據(jù)類型
MySQL學(xué)習(xí)第六天和大家一起學(xué)習(xí)MySQL基本數(shù)據(jù)類型,基本類型包括數(shù)值類型、日期和時間類型和字符串類型等,感興趣的小伙伴們可以參考一下2016-05-05MySQL group by和left join并用解決方式
這篇文章主要介紹了MySQL group by和left join并用解決方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12解決Win7 x64安裝解壓版mysql 5.7.18 winx64出現(xiàn)服務(wù)無法啟動問題
這篇文章主要介紹了解決Win7 x64安裝解壓版mysql 5.7.18 winx64出現(xiàn)服務(wù)無法啟動問題,需要的朋友可以參考下2017-05-05詳解mysql索引總結(jié)----mysql索引類型以及創(chuàng)建
索引是一種特殊的文件(InnoDB數(shù)據(jù)表上的索引是表空間的一個組成部分),它們包含著對數(shù)據(jù)表里所有記錄的引用指針。這篇文章主要介紹了詳解mysql索引總結(jié)----mysql索引類型以及創(chuàng)建,有興趣的可以了解一下。2016-11-11mysql行鎖(for update)解決高并發(fā)問題
這篇文章主要介紹了mysql行鎖(for update)解決高并發(fā)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08mysql創(chuàng)建表的sql語句詳細總結(jié)
在本篇文章里小編給大家整理的是關(guān)于mysql創(chuàng)建表的sql語句的相關(guān)知識點,需要的朋友們可以參考下。2020-02-02