MySQL 循环建表和结合两表的update

2015-07-16 12:07:11 · 作者: · 浏览: 1

使用存储过程,实现循环建表


DELIMITER //


CREATE PROCEDURE test.create_channel_avail()


BEGIN


DECLARE `@i` INT(11);


DECLARE `@sqlstr` VARCHAR(2800);


SET `@i`=1;


WHILE `@i` < 101 DO


SET @sqlstr = CONCAT(


"CREATE TABLE channel_avail",


`@i`, "(


? `prop` VARCHAR(40) ,


? `stay_date` DATE,


? `roomcode` VARCHAR(40),


? `channel_code` VARCHAR(40),


? `status` VARCHAR(1)? DEFAULT 'A' ,


? `createtime` DATETIME? COMMENT '创建时间戳',


? `updatetime` DATETIME? COMMENT '更新时间戳',


? PRIMARY KEY (`prop`,`stay_date`,`roomcode`,`channel_code`)


) ENGINE=INNODB


?DEFAULT CHARSET=utf8;


?"


);


PREPARE stmt FROM @sqlstr;


EXECUTE stmt;


SET `@i` = `@i` + 1;


END WHILE;


END;


CALL test.create_channel_avail_db();



DROP PROCEDURE test.create_channel_avail_db;



在使用MySQL数据库,update和select相结合去更新表中数据时要注意:


?如? 表test1
? ? ? A? B
? ? ? 1? a
? ? ? 2? b
? ? ? 3? c


? ? 表test2
? ? ? A? B
? ? 2? d
? ? ? 3? e
? ? ? 4? f
简单的update与select结合,本来是希望把test1表中的a=2和a=2两行的B列修改为d和e
?update from test1 set b = (select b from a where test1.a=test2.a)
注意这个语法是有个陷阱的,此时被更新的表test1中 a=2和a=3的确实被修改为d和e,可是由于a=1行的数据不在结果集里面,所有被set为null,,,也就是说除了结果集有的被更新,没有的值会被设置为null(不允许为null的列暂未测试)


使用inner join的方法就是我们想要的结果,所以要用该方法代替上面的SQL



update test1? INNER JOIN test2? ON a.id=b.id


SET test1.B=test2.B