【问题描述】
某信息系统,使用MYSQL做数据库服务,版本5.0.45,在准备对表结构进行升级时,使用sql脚本对表结构进行更改,包括增加列、更改列等操作,为防止重复运行升级脚本而出现错误,拟在进行alter table 之前检测某一字段是否存在,如:1、添加列,则要检测该列是否存在,如果不存在才进行add操作,否则不执行任何操作;
2、更改列,检测该列是否存在,如果存在则更新,否则添加该列;
3、删除列,检测该列是否存在,存在才执行操作【初步实现方法】
1、编写自定义函数,检测某个表或某个字段是否存在,从系统数据库 `information_schema`.`COLUMNS` 里查询
2、编写存储过程,在其中调用该函数查询某表或某表的某字段是否存在,并根据查询结果执行操作【代码示例】DELIMITER $$
DROP FUNCTION IF EXISTS `db_waasai`.`CheckIsObjectExist`$$
CREATE FUNCTION `db_waasai`.`CheckIsObjectExist`(table_name VARCHAR(50),colume_name varchar(50))
RETURNS BOOLEAN
BEGIN
DECLARE t_count TINYINT UNSIGNED;
SELECT count(0) INTO t_count FROM information_schema.COLUMNS where TABLE_NAME=table_name && (isnull(colume_name) || colume_name='' || COLUMN_NAME=colume_name);
RETURN t_count>0;
END$$DROP PROCEDURE if EXISTS `db_waasai`.`sp_update_106_107` $$
CREATE PROCEDURE `db_waasai`.`sp_update_106_107`()
BEGIN
IF NOT CheckIsObjectExist('tbl_user_card','') THEN
CREATE TABLE `tbl_user_card` (
`u_id` SMALLINT(6) UNSIGNED NOT NULL AUTO_INCREMENT,
`u_status` TINYINT(1) UNSIGNED DEFAULT '0',
`u_name` VARCHAR(20) NOT NULL,
PRIMARY KEY  (`u_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC;
END IF; IF NOT CheckIsObjectExist('tbl_user','u_cards_num') THEN
alter table `tbl_user` add column `u_cards_num` int (12) UNSIGNED  DEFAULT '0' NULL  after `u_age`;
update `tbl_user` set `u_cards_num`=1;
END IF;
END$$
DELIMITER ;CALL sp_update_106_107();
DROP PROCEDURE IF EXISTS `lsgw`.`sp_update_106_107`;
【引玉】
这只是我实现目的的方法,之前也尝试过用 if exists 之类的,但是始终没有成功,希望有朋友能够提供更简单、高效的方法【说明】
示例代码是根据实际运行成功的代码改写的,并不保证完全可用,hoho

解决方案 »

  1.   

    修改了下,支持UBB[code=SQL]
    DELIMITER   $$ 
    DROP   FUNCTION   IF   EXISTS   `db_waasai`.`CheckIsObjectExist`$$ 
    CREATE   FUNCTION   `db_waasai`.`CheckIsObjectExist`
    (
        table_name   VARCHAR(50),
        colume_name   varchar(50)

    RETURNS   BOOLEAN 
    BEGIN 
        DECLARE   t_count   TINYINT   UNSIGNED; 
        SELECT   count(0)   INTO   t_count   FROM   information_schema.COLUMNS   where   TABLE_NAME=table_name   &&   (isnull(colume_name)   ||   colume_name= ' '   ||   COLUMN_NAME=colume_name); 
        RETURN   t_count> 0; 
    END$$ DROP   PROCEDURE   if   EXISTS   `db_waasai`.`sp_update_106_107`   $$ 
    CREATE   PROCEDURE   `db_waasai`.`sp_update_106_107`() 
    BEGIN 
        IF   NOT   CheckIsObjectExist( 'tbl_user_card ', ' ')   THEN 
            CREATE   TABLE   `tbl_user_card`   ( 
            `u_id`   SMALLINT(6)   UNSIGNED   NOT   NULL   AUTO_INCREMENT, 
            `u_status`   TINYINT(1)   UNSIGNED   DEFAULT   '0 ', 
            `u_name`   VARCHAR(20)   NOT   NULL, 
            PRIMARY   KEY     (`u_id`) 
            )   ENGINE=MyISAM   DEFAULT   CHARSET=utf8   CHECKSUM=1   DELAY_KEY_WRITE=1   ROW_FORMAT=DYNAMIC; 
        END   IF;     IF   NOT   CheckIsObjectExist( 'tbl_user ', 'u_cards_num ')   THEN 
            alter   table   `tbl_user`   add   column   `u_cards_num`   int   (12)   UNSIGNED     DEFAULT   '0 '   NULL     after   `u_age`; 
            update   `tbl_user`   set   `u_cards_num`=1; 
        END   IF; 
    END$$ 
    DELIMITER; CALL   sp_update_106_107(); 
    DROP   PROCEDURE   IF   EXISTS   `lsgw`.`sp_update_106_107`;
    [code]