UPSERT

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

语法

upsert_statement ::=  UPSERT ['/*+' _l_ts_(timestamp) '*/'] 
                      INTO table_name
                      '(' columns ')' 
                      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关键字中确定几行数据。

  • 支持UPSERT ON DUPLICATE KEY操作,类似Hbase中的Check-And-Put操作,要求UPSERT指定的VALUE值可以确定一行。

    • ON DUPLICATE KEY跟随的是指定的需要更新的列和VALUE(暂时无法做到基于原有key存在性判断进行对应value更新),如果行不存在时不执行更新。

    • ON DUPLICATE KEY 跟随的是IGNORE则表示当检查的行不存在时则执行写入;如果已经存在则不执行写入保留原有数据。

    • 未指定 ON DUPLICATE KEY 条件时即时被检查的行已存在也会强制进行写入。

  • UPSERT ON DUPLICATE KEY操作仅支持CONSISTENCYstrong的表。CONSISTENCY参数的详细介绍,请参见CREATE TABLE。如果您想要更改CONSISTENCY参数的值,请参见ALTER TABLE

  • Lindorm SQL支持标准JDBC的访问方式,包括正常statement以及preparestatemt方式,但是对于标准JDBC在preparestatemt场景下的标准batch插入数据的方式仅在lindorm 2.2.16版本以后支持。

  • 支持通过HINT的方式指定写入数据行的时间戳,HINT名为_l_ts_。

示例

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 /*+ _l_ts_(111232) */ INTO dt (p1,p2,p3) VALUES('1','2','3');
-- 批量写入
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;
            

阿里云首页 云原生多模数据库Lindorm 相关技术圈