分布式数据库更新数据除了传统的update外还可以使用upsert using load into语法修改数据;
update:逐行更新,适用单行或极少数行更新场景;
upsert using load into:批量更新,适用于更新数据量大的情况,会对表上所有索引进行更新,该语法插入数据到有主键的表中时,会更新原有的数据为当前插入的数据;
以下说明三种update修改为upsert using load into语句的三种场景:
假如表结构字段顺序是col1,col2,col3...,col(i),...col(j),...
原来更新语句为:update table tb set col(i) = '1212', col(j) = '0000' where col(i) = '1200';
首先根据主键查询出修改的数据,使用 upsert using load into语句将修改后的数据插入到表中,由于主键值被修改,原有的数据不会更新,插入的是一条新的数据,然后需要将原有的数据删除;
upsert using load into tb select col1,col2...col(i-1),'1212',col(i+1),..col(j-1),'0000',col(j+1).... from tb where col(i) ='1200'; delete with no rollback from tb where col(i) = '1200';
首先根据主键查询出修改的数据,使用upsert using load into语句将修改后的数据插入到表中,由于主键没有改变,插入的数据会更新原表中相同主键行的数据,所以不需要删除语句;
upsert using load into tb select col1,col2...col(i-1),'1212',col(i+1),..col(j-1),'0000',col(j+1).... from tb where col(i) ='1200';
首先根据主键查询出修改的数据,使用upsert using load into语句将修改后的数据插入到表中,由于表中没有主键,插入的是一条新的数据,原有的数据还在,需要 将原有的数据删除;
upsert using load into tb select col1,col2...col(i-1),'1212',col(i+1),..col(j-1),'0000',col(j+1).... from tb where col(i) ='1200'; delete with no rollback from tb where col(i) = '1200';
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69985104/viewspace-2746524/ ,如需转载,请注明出处,否则将追究法律责任。