ITPub博客

首页 > 数据库 > SQL on Hadoop > EsgynDB更新语句update修改为upsert using load into的情况

EsgynDB更新语句update修改为upsert using load into的情况

原创 SQL on Hadoop 作者:joshliu 时间:2020-12-30 13:46:40 1 删除 编辑

分布式数据库更新数据除了传统的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';

更新场景一:更新主键字段,假设col(i)是主键: 

首先根据主键查询出修改的数据,使用 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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-10-09

  • 博文量
    78
  • 访问量
    74239