前言
发现之前并没有整理过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 JOIN
或LEFT JOIN
和ON连接条件
。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;