全部产品
Search
文档中心

云原生多模数据库 Lindorm:UPSERT

更新时间:Oct 27, 2023

本文介绍更新时空数据表的语法。

语法

upsert_statement ::=  UPSERT [hint_clause] INTO table_name
                      '('columns| _l_ts_')' 
                      VALUES '(' values ')'
                      [ ON DUPLICATE KEY update_column = update_value |IGNORE ]?
columns ::=  column_name, columns
values  ::=  term, values,'(' values ')'
             | function_name '(' term ( ',' term )* ')'
update_column ::= column_name
update_value ::= term

hint_clause::=/*+hint_items*/
hint_items::=hint_item(','hint_item)*
hint_item::=identifier('('hint_option(','hint_option)*')')
hint_option::=expression
说明
  • 支持批量写入,指定需要写入的相关列,可以在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(id, g, t) VALUES(0,ST_MakePoint(0.0,1.0),1000);
    • 方式二

      UPSERT INTO dt(id, g, t) VALUES(0,ST_GeomFromText('POINT (0.0 1.0)'),1000);
  • 在时空数据表中批量写入数据。

    UPSERT INTO dt (id, g, t) VALUES(1,ST_MakePoint(1.23,2.34),2000),(2,ST_MakePoint(3.45,5.67),3000),(3,ST_MakePoint(4.56,5.67),4000);
说明
  • 写入数据时使用到相关时空函数的说明,请参见函数概览

  • 通过Java JDBC写入数据的示例,请参见快速入门