1. 程式人生 > >[Mysql語法]--update inner join使用(批量更新)

[Mysql語法]--update inner join使用(批量更新)

一:需求

A表和B表的表結構相同,A表是歷史表,B表是增量資料表;想要根據關聯條件更新A表中的資料。

二:表結構

CREATE TABLE `A` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `bid` bigint(20) NOT NULL ,
  `sid` bigint(20) NOT NULL ,
  `grid` bigint(20) NOT NULL ,
  `age` bigint(20) NOT NULL ,
  `pv` bigint(20) NOT NULL ,
  `uv` bigint(20) NOT NULL ,
  `pay_count` bigint(20) NOT NULL,
  `charge_amount` bigint(20) NOT NULL ,
  `last_pay_count` bigint(20) NOT NULL ,
  `last_charge_amount` bigint(20) NOT NULL ,
  `ftime` bigint(20) NOT NULL ,
  `dtime` bigint(20) NOT NULL DEFAULT '0' COMMENT '詳細時間(yyyyMMddHH)'
  PRIMARY KEY (`id`,`ftime`),
  KEY `IX_FTIME` (`ftime`) USING BTREE,
  KEY `IX_HTIME` (`htime`) USING BTREE,
  KEY `IX_DTIME` (`dtime`),
  KEY `IX_B_F_S_G` (`bid`,`ftime`,`sid`,`grid`),
  KEY `IX_B_S_G` (`bid`,`sid`,`grid`),
  KEY `IX_B_D_S` (`bid`,`dtime`,`sid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

三:注意

1、只更新A表的部分欄位:pv、uv和pay_amount

2、確定唯一一條記錄的關聯欄位是:bid、sid、dtime、qrid

 

四:實現

1、使用inner join實現

UPDATE A as aa
INNER JOIN B as bb ON bb.bid = aa.bid
AND bb.sid=aa.sid
AND bb.grid=aa.grid
SET aa.pv=bb.pv,
    aa.uv=bb.uv,
    aa.pay_amount=bb.pay_amount
WHERE aa.dtime=?
  AND aa.bid=? ;

2、使用exists實現

UPDATE A aa 
SET    aa.pv = (SELECT bb.pv 
                FROM   B bb 
                WHERE  bb.bid = aa.bid 
                       AND bb.sid = aa.sid 
                       AND bb.grid = aa.grid), 
       aa.uv = (SELECT bb.uv 
                FROM   B bb 
                WHERE  bb.bid = aa.bid 
                       AND bb.sid = aa.sid 
                       AND bb.grid = aa.grid), 
       aa.pay_amount = (SELECT bb.pay_amount 
                        FROM   B bb 
                        WHERE  bb.bid = aa.bid 
                               AND bb.sid = aa.sid 
                               AND bb.grid = aa.grid) 
WHERE  EXISTS (SELECT 1 
               FROM   B bb 
               WHERE  bb.bid = aa.bid 
                      AND bb.sid = aa.sid 
                      AND bb.grid = aa.grid) 
       AND aa.dtime = ? 
       AND aa.bid = ?; 

注意:別名中,不要出現mysql的關鍵字!

五:參考

1、mysql關鍵字:https://dev.mysql.com/doc/refman/8.0/en/keywords.html

2、update inner join :https://stackoverflow.com/questions/11709043/mysql-update-column-with-value-from-another-table