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

php中文网
发布: 2016-06-07 15:53:35
原创
1287人浏览过

使用存储过程,实现循环建表 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

本文永久更新链接地址

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号