ITPub博客

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

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

原创 MySQL 作者:静以致远√团团 时间:2015-07-07 10:25:24 0 删除 编辑
使用存储过程,实现循环建表

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

      
      

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29320885/viewspace-1725304/,如需转载,请注明出处,否则将追究法律责任。

下一篇: MySQL 5.6.23安装
请登录后发表评论 登录
全部评论
每个人都有梦想,去实现吧!

注册时间:2013-11-14

  • 博文量
    164
  • 访问量
    2103383