有表如下
t_user:字段如下
id,name,phone
t_phone:字段如下
uid,phone
其中t_phone表的uid字段是外键并且唯一,他引用t_user的id字段,现需要将t_phone表的phone数据插入到t_user表中。
Mysql--针对于全部数据
update t_user,t_phone set t_user.phone = t_phone.PHONE where t_phone.UID = t_user.id;
-- Update
update的使用当针对于有关联的表时,update可以在set或者在where通过子查询做连接查询--oracle--针对于某条数据
update t_userxx set t_userxx.phone = (select t_phonexx.phone from t_phonexx inner join t_userxx on t_userxx.id = t_phonexx.uuid where t_userxx.id = '1') where t_userxx.id = '1';
update的使用当针对于有关联的表时,子查询的表关联的已经声明需要修改的表
oracle--针对于全部数据--有缺陷--如果有空的数据,就会将空的数据也更新过去。
update t_userxx set t_userxx.phone = ( select t_phonexx.phone from t_phonexx where t_userxx.id = t_phonexx.uuid )
oracle--针对于全部数据--可以过滤空数据(exists判读是否存在)
update t_userxx set t_userxx.phone = (select t_phonexx.phone from t_phonexx where t_userxx.id = t_phonexx.uuid) where exists (select 1 from t_phonexx where t_userxx.id = t_phonexx.uuid);
-- 内联视图更新,update后接多表查询的结果集,用返回的列进行更新
UPDATE ( select t1.fmoney fmoney1,t2.fmoney fmoney2 from t1,t2 where t1.fname = t2.fname )t set fmoney1 =fmoney2;
-- merge更新,最简洁,效率最高,在大数据量更新时,优先使用这种方式。
merge into t1
using (select t2.fname,t2.fmoney from t2) t on (t.fname = t1.fname) when matched
then update set t1.fmoney = t.fmoney;
-- 批量更新,de.user_id 为外键
UPDATE tab_user tuser
SET tuser.pay_total
=
//类似于根据外层where条件在里面进行批量更新,借助子查询
CASE tuser.id
WHEN id THEN (select sum(de.pay_amout) from tab_user_details de where de.user_id = tuser.id group by de.user_id )
END
WHERE tuser.id IN (select de.user_id from tab_user_details de group by de.user_id);
UPDATE categories
SET
display_order = CASE id
WHEN 1 THEN 3
WHEN 2 THEN 4
WHEN 3 THEN 5
END
, (可接多个进行更新)
title = CASE id
WHEN 1 THEN 'New Title 1'
WHEN 2 THEN 'New Title 2'
WHEN 3 THEN 'New Title 3'
END
WHERE id IN (1,2,3);
(这句sql 的意思是,更新display_order 字段,如果id=1 则display_order 的值为3,如果id=2 则dingdan 的值为4……
where部分不影响代码的执行,但是会提高sql执行的效率。确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行)
1、.replace into 批量更新
2、insert into ...on duplicate key update批量更新
3、创建临时表,先更新临时表,然后从临时表中update
4、使用mysql 自带的语句构建批量更新 case...when