Mysql數(shù)據(jù)庫創(chuàng)建存儲(chǔ)過程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法

2019-03-07 14:31:45 來源:互聯(lián)網(wǎng)作者:佚名 人氣: 次閱讀 667 條評(píng)論

本文實(shí)例講述了mysql創(chuàng)建存儲(chǔ)過程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法,結(jié)合實(shí)例形式對(duì)比分析了通過存儲(chǔ)過程新增字段相關(guān)操作技巧,需要的朋友可以參考下。...

  本文實(shí)例講述了MySQL創(chuàng)建存儲(chǔ)過程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法,結(jié)合實(shí)例形式對(duì)比分析了通過存儲(chǔ)過程新增字段相關(guān)操作技巧,需要的朋友可以參考下。

需求:

  往某數(shù)據(jù)庫的某個(gè)表中新增一個(gè)字段(若該字段已存在,則不做操作;若該字段不存在,則新增)

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

第一版:

  1. DELIMITER $
  2. CREATE PROCEDURE insert_column()
  3. BEGIN
  4. IF NOT EXISTS(SELECT 1 FROM information_schema.columns
  5. WHERE table_schema='ltivalley' AND table_name='t_luck'
  6. AND column_name='sss' ) THEN
  7. alter table ltivalley.t_luck add sss varchar(255) not Null;
  8. end if;
  9. END
  10. $
  11. DELIMITER ;

  此存儲(chǔ)過程可以做到往ltivalley數(shù)據(jù)庫的t_luck表中新增一個(gè)sss的字段,但寫死了,毫無靈活性,故沒用!

第二版:

  1. DELIMITER $
  2. CREATE PROCEDURE insert_column(in dbname varchar(255),in tbname varchar(255),in colname varchar(255))
  3. set @sql_1= concat("IF NOT EXISTS(SELECT 1 FROM
  4. information_schema.columns WHERE table_schema=",dbname,"
  5. AND table_name=",tbname," AND column_name=",colname,")
  6. THEN
  7. alter table ",dbname,".",tbname," add ",colname,"
  8. varchar(255) not null;
  9. end if;");
  10. PREPARE stmt FROM @sql_1;
  11. EXECUTE stmt;
  12. DEALLOCATE PREPARE stmt;
  13. END
  14. $
  15. DELIMITER ;

  創(chuàng)建存儲(chǔ)過程沒有問題,但當(dāng)調(diào)用的時(shí)候就會(huì)出錯(cuò),報(bào) "IF"左右出錯(cuò),原因是在mysql中IF只能存在于存儲(chǔ)過程中,此處用EXECUTE stmt來執(zhí)行,等于是不在存儲(chǔ)過程里面執(zhí)行if語句,所以報(bào)錯(cuò),執(zhí)行不了!故沒用!

第三版

  1. DELIMITER $
  2. CREATE PROCEDURE insert_column(in dbname varchar(255),in tbname varchar(255),in colname varchar(255))
  3. BEGIN
  4. SET @selec=CONCAT('SELECT 1 FROM information_schema.columns WHERE table_schema="',dbname,'" AND table_name="',tbname,'" AND column_name="',colname,'"');
  5. PREPARE selec FROM @selec;
  6. SET @addcol=CONCAT('ALTER TABLE ',dbname,'.',tbname,' ADD ',colname,' VARCHAR(255)');
  7. PREPARE addcol FROM @addcol;
  8. IF NOT EXISTS(EXECUTE selec;)THEN
  9. EXECUTE addcol;
  10. END IF;
  11. END
  12. $
  13. DELIMITER ;

  無法創(chuàng)建存儲(chǔ)過程,原因是在IF NOT EXISTS()中,不能執(zhí)行EXECUTE selec語句,原因未知。故沒用!

終極版

  1. DROP PROCEDURE IF EXISTS insert_column;
  2. DELIMITER $
  3. CREATE PROCEDURE insert_column(in dbname varchar(255),in tbname varchar(255),in colname varchar(255))
  4. BEGIN
  5. set @iscolexists = 0;
  6. SET @selec=CONCAT('SELECT count(*) into @iscolexists FROM information_schema.columns WHERE table_schema="',dbname,'" AND table_name="',tbname,'" AND column_name="',colname,'"');
  7. PREPARE selec FROM @selec;
  8. EXECUTE selec;
  9. DEALLOCATE PREPARE selec;
  10. SET @addcol=CONCAT('ALTER TABLE ',dbname,'.',tbname,' ADD ',colname,' VARCHAR(255)');
  11. PREPARE addcol FROM @addcol;
  12. IF(@iscolexists=0)THEN
  13. EXECUTE addcol;
  14. END IF;
  15. END
  16. $
  17. DELIMITER ;

  最終的結(jié)果,先執(zhí)行EXECUTE selec,將結(jié)果存放到一個(gè)變量@iscolexists中,然后再在IF()中判斷@iscolexists的值,做相應(yīng)操作。可用!

  以上就是Mysql數(shù)據(jù)庫創(chuàng)建存儲(chǔ)過程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法的全部?jī)?nèi)容了,希望本文所述對(duì)大家MySQL數(shù)據(jù)庫計(jì)有所幫助。

您可能感興趣的文章

相關(guān)文章