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

【问题描述】

某信息系统,使用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`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值