MySQL 迴圈建表和結合兩表的update
使用預存程序,實現迴圈建表
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
本文永久更新連結地址: