更新时间:2024-09-02 GMT+08:00

MERGE INTO

功能描述

通过MERGE INTO语句,将目标表和源表中数据针对关联条件进行匹配,若关联条件匹配时对目标表进行UPDATE,无法匹配时对目标表执行INSERT。此语法可以很方便地用来合并执行UPDATE和INSERT,避免多次执行。

注意事项

对于并发MERGEINTO场景,触发UPDATE时,传统列存储格式由于同时操作相同CU时会产生锁冲突所以并发性能较差,对于HStore表由于不需要阻塞等待,并发MERGE INTO性能可达到列存的百倍以上。

语法格式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
MERGE INTO table_name [ [ AS ] alias ]
USING { { table_name | view_name } | subquery } [ [ AS ] alias ]
ON ( condition )
[
  WHEN MATCHED THEN
  UPDATE SET { column_name = { expression | DEFAULT } |
          ( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...]
  [ WHERE condition ]
]
[
  WHEN NOT MATCHED THEN
  INSERT { DEFAULT VALUES |
  [ ( column_name [, ...] ) ] VALUES ( { expression | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] }
];

参数说明

  • INTO子句

    指定正在更新或插入的目标表。

    • table_name

      目标表的表名。

    • alias

      目标表的别名。

      取值范围:字符串,符合标识符命名规范。

  • USING子句

    指定源表,源表可以为表、视图或子查询。

  • ON子句

    关联条件,用于指定目标表和源表的关联条件。不支持更新关联条件中的字段。ON关联条件可以是ctid, xc_node_id, tableoid这三个系统列。

  • WHEN MATCHED子句

    当源表和目标表中数据针对关联条件可以匹配上时,选择WHEN MATCHED子句进行UPDATE操作。

    不支持更新分布列、系统表以及系统列。

  • WHEN NOT MATCHED子句

    当源表和目标表中数据针对关联条件无法匹配时,选择WHEN NOT MATCHED子句进行INSERT操作。

    • 不支持INSERT子句中包含多个VALUES。
    • WHEN MATCHED和WHEN NOT MATCHED子句顺序可以交换,可以缺省其中一个,但不能同时缺省。
    • 不支持同时指定两个WHEN MATCHED或WHEN NOT MATCHED子句。

示例

创建进行MERGE INTO的目标:
1
2
CREATE TABLE target(a int, b int)WITH(ORIENTATION = COLUMN, ENABLE_HSTORE = ON);
INSERT INTO target VALUES(1, 1),(2, 2);
创建数据源表:
1
2
CREATE TABLE source(a int, b int)WITH(ORIENTATION = COLUMN, ENABLE_HSTORE = ON);
INSERT INTO source VALUES(1, 1),(2, 2),(3, 3),(4, 4),(5, 5);
执行MERGE INTO操作:
1
2
3
4
5
6
7
MERGE INTO target t   
USING source s   
ON (t.a = s.a)   
WHEN MATCHED THEN  
  UPDATE SET t.b = t.b + 1  
WHEN NOT MATCHED THEN  
  INSERT VALUES (s.a, s.b) WHERE s.b % 2 = 0;