Heim  >  Artikel  >  Datenbank  >  MySQL 循环建表和结合两表的update

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

WBOY
WBOYOriginal
2016-06-07 15:53:351192Durchsuche

使用存储过程,实现循环建表 DELIMITER // CREATE PROCEDURE test.create_channel_avail() BEGIN DECLARE `@i` INT(11); DECLARE

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

DELIMITER //

CREATE PROCEDURE test.create_channel_avail()

BEGIN

DECLARE `@i` INT(11);

DECLARE `@sqlstr` VARCHAR(2800);

SET `@i`=1;

WHILE `@i`

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

本文永久更新链接地址

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn