Welcome 微信登录

首页 / 数据库 / MySQL / MySQL 循环建表和结合两表的update

使用存储过程,实现循环建表DELIMITER //CREATE PROCEDURE test.create_channel_avail()BEGINDECLARE `@i` INT(11);DECLARE `@sqlstr` VARCHAR(2800);SET `@i`=1;WHILE `@i` < 101 DOSET @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.idSET test1.B=test2.B本文永久更新链接地址