背景:replace很好用,的应用场景比较多,但是直接使用可能会造成一引起字段的值丢失.
解决方法:
一.原始数据
select id,f1,f2 ,flag from update_test;
id f1 f2 flag
1 1 a 1
2 2 b 1
二.更新一条记录(注意字段flag的值会丢失)
replace into update_test(id,f1,f2)
select 1 id,'100' f1,'aa' f2
;
id f1 f2 flag
1 100 aa (null)
2 2 b 1
注意:replace是先删除,后插入;如果插入的数据是部分字段(如读取订单.csv),那么其实就造成了数据丢失.
三.避免方法,通过关联语句先查询出整行数据:
replace into update_test(id,f1,f2,flag)
select a.id,a.f1,a.f2,b.flag
from (select 2 id,'200' f1,'bb' f2 ) a join (select id,flag from update_test) b on a.id=b.id
;
影响行数:2
查询数据:
select id,f1,f2 ,flag from update_test;
id f1 f2 flag
1 100 aa (丢失)
2 200 bb 1 (保存了原来的数据)
#