mysql之关联更新(update join,用b表更新a表记录)

前言

发现之前并没有整理过mysql表关联更新,这里补上。有时候我们需要用b表去更新a表的记录,如果只有一个字段那通常我们可能就update set a.xxx=(select b.xxx from b where a.ib.id) ,但是字段一多,显得就不是特别方便了,加上不好做限制,所以就了update join。

解决思路

主表

CREATE TABLE `unit` (
  `unit_id` int(11) NOT NULL AUTO_INCREMENT,
  `price` decimal(10,2) DEFAULT NULL COMMENT '价格指数',
  `fix_flag` tinyint(1) DEFAULT '0' COMMENT '修复标记'
) ;

修复表/关联更新表

CREATE TABLE `unit_fix` (
  `unit_id` int(11) DEFAULT NOT NULL,
  `price` decimal(10,2) DEFAULT NULL COMMENT '价格指数'
) ;

蹩脚的更新语句

UPDATE unit u 
SET u.bid_unit =( SELECT x.price FROM unit_fix x WHERE x.unit_id = u.unit_id ),
	u.fix_flag = 1 
WHERE
	u.unit_id IN ( SELECT xx.unit_id FROM unit_fix xx );

关联更新语句

#by zhengkai.blog.csdn.net
#MYSQL UPDATE关联更新
UPDATE unit u
JOIN unit_fix uf ON u.unit_id = uf.unit_id 
SET u.price = uf.price,
	u.fix_flag = 1 
WHERE
	uf.tender_id IS NOT NULL;

MySQL UPDATE JOIN语法

在MySQL中,可以在UPDATE语句中使用JOIN子句执行跨表更新。

#by zhengkai.blog.csdn.net
UPDATE T1, T2,
[INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1
SET T1.C2 = T2.C2, 
    T2.C3 = expr
WHERE condition
  • 首先,在UPDATE子句之后,指定主表(T1)和希望主表连接表(T2)。 请注意,必须在UPDATE子句之后至少指定一个表。UPDATE子句后未指定的表中的数据未更新。
  • 第二,指定一种要使用的连接,即 INNER JOINLEFT JOINON连接条件 。JOIN子句必须出现在UPDATE子句之后。
  • 第三,要为要更新的T1和/或T2表中的列分配新值 。SET
  • 第四,WHERE子句中的条件用于指定要更新的行,例如什么值不为空之类。

如果您学习过了UPDATE语句教程,您可能会注意到使用以下语法更新数据交叉表的另一种方法:

#UPDATE交叉更新
UPDATE T1, T2
SET T1.c2 = T2.c2,
	T1.c3 = T2.c3
WHERE T1.id= T2.id AND condition

在这个UPDATE交叉更新语句具有隐式INNER JOIN子句的UPDATE JOIN工作相同。也就是等同于:

#UDATE关联更新
UPDATE T1
INNER JOIN T2 ON T1.id = T2.id
SET T1.C2 = T2.C2, 
	T1.C3 = T2.C3
WHERE condition

后续

如果你发现无法update join,试下双表update语句

update unit u,unit_fix uf
set u.price=uf.price,u.bid_unit=uf.bid_unit,u.fix_flag=2,u.business_status=uf.business_status
where u.unit_id=uf.unit_id;
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页