MERGE INTO

原生 MatrixOne 表不支持 MERGE INTO。该语句是否可用取决于 Iceberg 的写入、DML 和删除配置。

描述

MERGE INTO 将源关系中的行合并到目标表中。对于每一行,ON 条件决定它是否匹配:

  • WHEN MATCHED THEN UPDATE SET ... 更新匹配的目标行。

  • WHEN MATCHED THEN DELETE 删除匹配的目标行。

  • WHEN NOT MATCHED THEN INSERT ... VALUES (...) 插入新行。

每个动作子句都可以附加一个 AND <condition> 来进一步限定其适用条件。至少需要一个动作子句。

在 MatrixOne 中,MERGE INTO 目前仅支持以 Iceberg 表映射作为合并目标。因此目标表必须是由已注册的 Iceberg 目录支持的外部表。

前置条件

MERGE INTO 目前仅适用于 Iceberg 外部表映射。使用前需要:

  • 注册并配置 Iceberg 目录。

  • 配置 principal mapping 和 residency policy。

  • 启用 Iceberg 写入操作。

  • 启用 DML 和删除操作。

Iceberg 默认关闭。需要在每个可能执行该语句的 CN 上启用全部写入和行级 DML 开关:

[cn.frontend.iceberg]
enable = true
enable-write = true
enable-dml = true
enable-delete = true

目录还必须按照 CREATE ICEBERG CATALOG 中的说明,通过 iceberg_register_access 注册 principal mapping 和 residency policy。执行 MERGE INTO 前,应使用显式列和兼容的非 read_only write_mode 定义目标表。

语法

MERGE INTO target [AS alias]
USING source [AS alias]
ON expression
[WHEN MATCHED [AND condition] THEN UPDATE SET column = value [, column = value] ...]
[WHEN MATCHED [AND condition] THEN DELETE]
[WHEN NOT MATCHED [AND condition] THEN INSERT [(column [, column] ...)] VALUES (value [, value] ...)]

参数

参数

说明

target

要修改的 Iceberg 表映射。

source

其行与目标进行比较的关系。

expression

决定一行是否匹配的连接条件。

WHEN MATCHED ... UPDATE

更新匹配的目标行,要求 MATCHED

WHEN MATCHED ... DELETE

删除匹配的目标行,要求 MATCHED

WHEN NOT MATCHED ... INSERT

插入新行,要求 NOT MATCHED

示例

运行示例前必须先创建 iceberg_ordersincoming_orders。其中 iceberg_orders 必须是可写的 Iceberg 外部表映射。

MERGE INTO iceberg_orders AS t
USING incoming_orders AS s
ON t.order_id = s.order_id
WHEN MATCHED THEN UPDATE SET t.status = s.status, t.total = s.total
WHEN NOT MATCHED THEN INSERT (order_id, status, total) VALUES (s.order_id, s.status, s.total);

限制

  • MERGE INTO 不支持 RETURNING 子句。

  • 目标必须是 Iceberg 表映射;不支持合并原生 MatrixOne 表。