#更改表结构

ALTER TABLE e_feerule CHANGE code prefix varchar(255) not null;
ALTER TABLE e_feerule CHANGE locationName location varchar(255) not null;
ALTER TABLE e_feerule CHANGE ruleset_id feerategroup_id int(11) not null;
ALTER TABLE e_customer CHANGE ruleset_id feerategroup_id int(11) not null;
ALTER TABLE e_customer CHANGE state locktype int(11) null;
ALTER TABLE e_customer DROP COLUMN paytype;
ALTER TABLE e_customer DROP COLUMN alarmmoney;
ALTER TABLE e_customer DROP COLUMN discountset_id;
ALTER TABLE e_bill_template CHANGE gatewayfeetime agentfeetime int(11) null;
ALTER TABLE e_bill_template ADD feeprefix varchar(255) null after holdtime;
ALTER TABLE e_bill_template ADD suitefeetime int(11) null after fee;
ALTER TABLE e_bill_template ADD suitefee double null after fee;
ALTER TABLE e_bill_template ADD agentfeeprefix varchar(255) null after customername;
ALTER TABLE e_bill_template ADD agentsuitefeetime int(11) null after agentfee;
ALTER TABLE e_bill_template ADD agentsuitefee double null after agentfee;
ALTER TABLE e_bill_template CHANGE relateindex cdrlevel int(11) null;
ALTER TABLE e_bill_template CHANGE rel_id subcdr_id int(11) null;
ALTER TABLE e_gateway DROP COLUMN remainmoney;
ALTER TABLE e_gateway DROP COLUMN ruleset_id;
ALTER TABLE e_gateway DROP COLUMN discountset_id;
ALTER TABLE e_gateway ADD clearingcustomer_id int(11) not null after mbx_id;
UPDATE e_gateway SET clearingcustomer_id = -1;
ALTER TABLE r_ruleset_privileges CHANGE ruleset_id feerategroup_id int(11) null;
ALTER TABLE e_discountset ADD giftmoney double null after name;
ALTER TABLE e_discountset ADD rentfee double null after name;
ALTER TABLE e_discountset ADD renttype int(11) null after name;
ALTER TABLE r_discountset_privileges CHANGE discountset_id suite_id int(11) null;
ALTER TABLE e_ot_maxid CHANGE maxid maxid bigint null;
UPDATE e_ot_maxid SET maxid = "SELECT MAX(flowno) FROM e_bill" WHERE type = 'e_bill_flowno';
UPDATE e_ot_maxid SET type = 'e_cdr' WHERE type = 'e_bill';
UPDATE e_ot_maxid SET type = 'e_cdr_flowno' WHERE type = 'e_bill_flowno';

#更改旧表

ALTER TABLE e_feerule RENAME e_feerate;
ALTER TABLE e_ot_maxid RENAME e_othermaxid;
ALTER TABLE e_bill_template RENAME e_cdr_template;
ALTER TABLE e_ruleset RENAME e_feerategroup;
ALTER TABLE r_ruleset_privileges RENAME r_feerategroup_privileges;
ALTER TABLE e_discountset RENAME e_suite;
ALTER TABLE r_discountset_privileges RENAME r_suite_privileges;
DROP TABLE e_payhistory_other;

#创建新表

create table if not exists e_feeratebytime (
id int(11),
type int(11) null,
startday bigint null,
endday bigint null,
starttime int(11) null,
endtime int(11) null,
suite_id int(11),
feerategroup_id int(11),
primary key (id)
) type=MyISAM;

create table if not exists e_suiteorder (
id int(11) not null,
availabletime bigint null,
suite_id int(11) not null,
customer_id int(11) not null,
primary key (id)
) type=MyISAM;

create table if not exists e_gifttime (
id int(11) not null,
prefix varchar(255) null,
gifttime int(11) null,
memo varchar(255) null,
suite_id int(11) not null,
primary key (id)
) type=MyISAM;

create table if not exists e_currentgifttime (
id int(11) not null,
prefix varchar(255) null,
gifttime int(11) null,
memo varchar(255) null,
currentsuite_id int(11) not null,
primary key (id)
) type=MyISAM;

create table if not exists e_currentsuite (
id int(11) not null,
name varchar(255) null,
renttype int(11) null,
nextrenttime bigint null,
giftmoney double null,
suiteoderid int(11) null,
suiteid int(11) null,
customer_id int(11) not null,
primary key (id)
) type=MyISAM;

#存储过程

DELIMITER //

DROP PROCEDURE IF EXISTS updatetable//

CREATE PROCEDURE updatetable(prefixcmd text,tableprefix text,postfixcmd text)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a CHAR(32);
DECLARE cur1 CURSOR FOR SHOW TABLES;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO a;
IF a LIKE tableprefix THEN
SET @sqlcmd = CONCAT(prefixcmd,' ',a,' ',postfixcmd);
SELECT @sqlcmd;
prepare sqlstmt FROM @sqlcmd;
execute sqlstmt;
END IF;
until done END REPEAT;
CLOSE cur1;
END//

DROP PROCEDURE IF EXISTS renametable//

CREATE PROCEDURE renametable(tableprefix text)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a CHAR(32);
DECLARE cur1 CURSOR FOR SHOW TABLES;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO a;
IF a LIKE tableprefix THEN
SET @newname := REPLACE(a,'bill','cdr');
SET @sqlcmd = CONCAT('ALTER TABLE',' ',a,' ','RENAME ', @newname);
SELECT @sqlcmd;
prepare sqlstmt FROM @sqlcmd;
execute sqlstmt;
END IF;
until done END REPEAT;
CLOSE cur1;
END//

DROP PROCEDURE IF EXISTS droptable//

CREATE PROCEDURE droptable(tableprefix text)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a CHAR(32);
DECLARE cur1 CURSOR FOR SHOW TABLES;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO a;
IF a LIKE tableprefix THEN
SET @sqlcmd = CONCAT('DROP TABLE ',a);
SELECT @sqlcmd;
prepare sqlstmt FROM @sqlcmd;
execute sqlstmt;
END IF;
until done END REPEAT;
CLOSE cur1;
END//

DELIMITER ;

#调用存储过程

CALL updatetable('ALTER TABLE','e_bill_%','CHANGE gatewayfeetime agentfeetime int(11)');
CALL updatetable('ALTER TABLE','e_bill_%','ADD feeprefix varchar(255) after holdtime');
CALL updatetable('ALTER TABLE','e_bill_%','ADD suitefeetime int(11) after fee');
CALL updatetable('ALTER TABLE','e_bill_%','ADD suitefee double after fee');
CALL updatetable('ALTER TABLE','e_bill_%','ADD agentfeeprefix varchar(255) after customername');
CALL updatetable('ALTER TABLE','e_bill_%','ADD agentsuitefeetime int(11) after agentfee');
CALL updatetable('ALTER TABLE','e_bill_%','ADD agentsuitefee double after agentfee');
CALL updatetable('ALTER TABLE','e_bill_%','CHANGE relateindex cdrlevel int(11)');
CALL updatetable('ALTER TABLE','e_bill_%','CHANGE rel_id subcdr_id int(11)');
CALL renametable('e_bill_%');
CALL droptable('e_bill');

#删除存储过程

DROP PROCEDURE updatetable;
DROP PROCEDURE renametable;
DROP PROCEDURE droptable;

#确保执行后的结束符仍为;

DELIMITER ;
注:以上为MySQL数据库升级脚本upgrade.sql。命令行下输入mysql < upgrade.sql即可执行。