51代码网ORACLEMYSQLSQL SERVER其它数据库java/jspasp/asp.netC/C++/VC++APP应用其它语言服务器应用
您现在的位置: 51代码网 >> mysql >> 文章正文

mysql表结构升级时根据字段是否存在执行相应操作

更新时间:2012-1-3:  来源:51代码网

【问题描述】
某信息系统,使用MYSQL做数据库服务,版本5.0.45,在准备对表结构进行升级时,使用sql脚本对表结构进行更改,包括增加列、更改列等操作,为防止重复运行升级脚本而出现错误,拟在进行alter   table   之前检测某一字段是否存在,如:

1、添加列,则要检测该列是否存在,如果不存在才进行add操作,否则不执行任何操作;
2、更改列,检测该列是否存在,如果存在则更新,否则添加该列;
3、删除列,检测该列是否存在,存在才执行操作

【初步实现方法】
1、编写自定义函数,检测某个表或某个字段是否存在,从系统数据库   `information_schema`.`COLUMNS`   里查询
2、编写存储过程,在其中调用该函数查询某表或某表的某字段是否存在,并根据查询结果执行操作

【代码示例】
[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]

【引玉】
这只是我实现目的的方法,之前也尝试过用   if   exists   之类的,但是始终没有成功,希望有朋友能够提供更简单、高效的方法

【说明】
示例代码是根据实际运行成功的代码改写的,并不保证完全可用,hoho

修改了下,支持UBB

[code=SQL]
DELIMITER $$ 
DROP FUNCTION IF EXISTS `db_waasai`.`CheckIsObjectExist`$$ 
CREATE FUNCTION `db_waasai`.`CheckIsObjectExist`

[1] [2] 下一页

  • 上一篇文章:
  • 下一篇文章: 没有了
  • 赞助商链接
    推荐文章
  • 此栏目下没有推荐文章
  • {
    设为首页 | 加入收藏 | 友情链接 | 网站地图 | 联系站长 |