更新数据或插入数据。Upsert是Insert与Update的结合体,表示行存在时执行Update,不存在时执行Insert。执行Upsert时必须要指定完全的Primary key的相关列信息。Upsert语法支持带时间戳的插入和批量写入。

语法

upsert_statement ::=  UPSERT INTO table_name
                      '('columns| _l_ts_')' 
                      VALUES '(' values ')'
                      [ ON DUPLICATE KEY update_column = update_value |IGNORE ]?
columns ::=  column_name, columns
values  ::=  term, values,'(' values ')'
update_column ::= column_name
update_value ::= term
说明
  • 支持批量写入,指定需要写入的相关列,可以在Values关键字中确定几行数据。
  • 如果用户需要指定插入的时间戳,可以在插入的时候,指定需要插入的数据列外,使用_l_ts_可以额外指定插入的特定列,对应values表示要插入的这一行数据的时间戳。
  • 支持upsert on duplicate key 操作,类似check and put操作,要求upsert 指定的value值可以确定一行。如果ON DUPLICATE KEY跟随的是指定的需要更新的列和value,(暂时无法做到基于原有key存在性判断进行对应value更新),如果存在则抛出异常。 如果是 ON DUPLICATE KEY IGNORE表示忽略对应的确定的一行 是否存在的检查,直接进行插入。
  • Lindorm SQL 支持标准jdbc的访问方式,包括正常statement以及preparestatemt方式,但是对于标准jdbc在preparestatemt场景下的标准batch插入数据的方式仅在lindorm 2.2.16版本以后支持。

示例

upsert into dt (p1,p2,c1,c2) values(10, 20, 30, 40);
upsert into dt (p1,p2,c2) values(10, 20, 40);   -- 仅写入一行的部分列
upsert into dt (p1,p2,c1) values(10, 20, 30);   -- 再写入同一行的其他列

-- 等价于upsert into dt (p1,p2,c2) values(10, 20, 5),忽略on duplicate key ignore操作
upsert into dt (p1,p2,c2) values(10, 20, 5) on duplicate key ignore;

-- 条件更新,对数据源行p1=10,p2=20,c2=5,进行c1 = 30的列的数据插入。
upsert into dt (p1,p2,c2) values(10, 20, 5) on duplicate key update c1 = 30;

-- 插入的行,时间戳是111232
 UPSERT INTO dt (p1,p2,p3,_l_ts_) values('1','2','3',111232);

-- 批量写入
upsert into dt (p1,p2,c1,c2) values(1,2,3,4), (2,3,4,5), (3,4,5,6);

--- upsert on duplicate key ignore,如果1 2 3 4 5 确定的行不存在则insert
upsert into dt (p1,p2,p3,c1,c2) values (1,2,3,4,5) on duplicate key ignore;
--- upsert on duplicate key ,如果1 2 3 4 5 确定的行不存在则不insert,抛出异常,存在则update c2 为6
upsert into dt (p1,p2,p3,c1,c2) values (1,2,3,4,5) on duplicate key update c2 = 6;