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的值,做相應操作。可用!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM