mysql -- 預存程序 往資料表中新增欄位

來源:互聯網
上載者:User

標籤:

需求:

  往某資料庫的某個表中新增一個欄位(若該欄位已存在,則不做操作;若該欄位不存在,則新增)

百度了n久,沒有符合要求的例子,只有參考加自己琢磨,最終終於給弄出來了,以下是幾個版本的更迭

第一版:
DELIMITER $$CREATE PROCEDURE insert_column()BEGINIF 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))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 ;

無法建立預存程序,原因是在IF NOT EXISTS()中,不能執行EXECUTE selec語句,原因未知。故沒用!

 

終極版
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 ;

最終的結果,先執行EXECUTE selec,將結果存放到一個變數@iscolexists中,然後再在IF()中判斷@iscolexists的值,做相應操作。可用!

mysql -- 預存程序 往資料表中新增欄位

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.