MERGE(预览版) - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

MERGE(预览版)

这是面向预览版中的 MERGE 命令的预发布文档。文档和功能都可能会更改。我们建议您只在测试集群中使用此功能,而不要在生产环境中使用。公开预览将于 2023 年 4 月 5 日结束。在预览结束两周后会自动删除预览集群和预览无服务器工作组和命名空间。有关预览条款和条件,请参阅 Amazon 服务条款中的测试版和预览
注意

您可以在 Preview(预览)中创建 Amazon Redshift 集群,以便测试 Amazon Redshift 的新功能。您无法在生产环境中使用这些功能,也无法将 Preview(预览)集群移动到生产集群或另一个跟踪上的集群。有关预览条款和条件,请参阅 Amazon 服务条款中的测试版和预览

Preview(预览)中创建集群
  1. 登录到 Amazon Web Services Management Console并打开 Amazon Redshift 控制台,网址:https://console.aws.amazon.com/redshift/

  2. 在导航菜单上,选择 Provisioned clusters dashboard(预置集群控制面板),然后选择 Clusters(集群)。列出您的账户在当前 Amazon Web Services 区域 区域中的集群。列表中的各个列中显示了每个集群的一部分属性。

  3. Clusters(集群)列表页面上会显示一个横幅,其中介绍了预览。选择 Create preview cluster(创建预览集群)按钮以打开创建集群页面。

  4. 输入集群的属性。选择包含要测试的功能的 Preview track(预览跟踪)。我们建议输入的集群名称指明要对该集群进行预览跟踪。为您的集群选择选项,包括标记为 -preview 的选项,用于要测试的功能。有关创建集群的一般信息,请参阅《Amazon Redshift 管理指南》中的创建集群

  5. 选择 Create preview cluster(创建预览集群)以在预览中创建集群。

  6. 当您的预览集群可用时,使用 SQL 客户端加载和查询数据。

您的集群必须使用名为 preview_2022 的预览跟踪来创建。

您可以在 Preview(预览)中创建 Amazon Redshift Serverless 工作组,以便测试 Amazon Redshift Serverless 的新功能。您无法在生产中使用这些功能,也无法将 Preview(预览)工作组移至生产工作组。有关预览条款和条件,请参阅 Amazon 服务条款中的测试版和预览

Preview(预览)中创建工作组
  1. 登录到 Amazon Web Services Management Console并打开 Amazon Redshift 控制台,网址:https://console.aws.amazon.com/redshift/

  2. 在导航菜单上,选择 Severless dashboard(Severless 控制面板),然后选择 Workgroup configuration(工作组配置)。列出您的账户在当前 Amazon Web Services 区域 中的工作组。列表中的各列中显示了每个工作组的一部分属性。

  3. Workgroups(工作组)列表页面上会显示一个横幅,其中介绍了预览。选择 Create preview workgroup(创建预览工作组)按钮以打开创建工作组页面。

  4. 输入工作组的属性。我们建议输入的工作组名称指明该工作组处于预览状态。为您的工作组选择选项,包括标记为 -preview 的选项,用于要测试的功能。继续浏览页面,为您的工作组和命名空间输入选项。有关创建工作组的一般信息,请参阅《Amazon Redshift 管理指南》中的创建带有命名空间的工作组

  5. 选择 Create preview workgroup(创建预览工作组)以在预览模式下创建工作组。

  6. 当您的预览工作组可用时,使用 SQL 客户端加载和查询数据。

按条件将源表中的行合并到目标表中。通常这只能通过单独使用多个插入、更新或删除语句来实现。有关 MERGE 允许您合并的操作的更多信息,请参阅 UPDATEDELETEINSERT

语法

MERGE INTO target_table USING source_table [ [ AS ] alias ] ON match_condition WHEN MATCHED THEN { UPDATE SET col_name = { expr } [,...] | DELETE } WHEN NOT MATCHED THEN INSERT [ ( col_name [,...] ) ] VALUES ( { expr } [, ...] )

参数

target_table

MERGE 语句合并到的临时表或永久表。

source_table

提供要合并到 target_table 的行的临时表或永久表。source_table 也可以是 Spectrum 表、Postgres 联合表或 MySQL 联合表。source_table 不能是视图或子查询。

alias

source_table 的临时备用名称。

此参数为可选项。在别名前加上 AS 也是可选的。

match_condition

在源表列和目标表列之间指定同等的谓词,用于确定 source_table 中的行是否可以与 target_table 中的行匹配。如果满足条件,MERGE 会对该行运行 matched_clause。否则 MERGE 会为该行运行 not_matched_clause

WHEN MATCHED

指定当源行和目标行之间的匹配条件计算结果为 True 时要执行的操作。您可以指定 UPDATE 操作或 DELETE 操作。

更新

更新 target_table 中的匹配行。仅更新您在 col_name 中指定的值。

删除

删除 target_table 中的匹配行。

WHEN NOT MATCHED

指定当匹配条件计算结果为 False 或 Unknown 时要执行的操作。只能为此子句指定 INSERT 插入操作。

INSERT

target_table 中插入一行。可以按任意顺序列出目标 col_name。如果您不提供任何 col_name 值,则默认顺序是表中所有列的声明顺序。

col_name

要修改的一个或多个列名。指定目标列时不包括表名。

expr

定义新 col_name 值的表达式。

使用说明

  • 要运行 MERGE 语句,您必须是 source_tabletarget_table 的所有者,或者具有这些表的 SELECT 权限。此外,您必须拥有 target_table 的 UPDATE、DELETE 和 INSERT 权限,具体取决于 MERGE 语句中包括的操作。

  • target_table 不能是系统表、目录表或外部表。

  • source_tabletarget_table 不能是同一个表。

  • 不能在 MERGE 语句中使用 WITH 子句。

  • source_table 中的行不能匹配 target_table 中的多行。

  • match_conditionexpr 不能部分引用 SUPER 类型列。例如,如果您的 SUPER 类型对象是数组或结构,则不能为 match_conditionexpr 使用该列的个别元素,但您可以使用整列。

    考虑以下示例:

    CREATE TABLE IF NOT EXISTS target (key INT, value SUPER); CREATE TABLE IF NOT EXISTS source (key INT, value SUPER); INSERT INTO target VALUES (1, JSON_PARSE('{"key": 88}')); INSERT INTO source VALUES (1, ARRAY(1, 'John')), (2, ARRAY(2, 'Bill')); MERGE INTO target USING source ON target.key = source.key WHEN matched THEN UPDATE SET value = source.value[0] WHEN NOT matched THEN INSERT VALUES (source.key, source.value[0]); ERROR: Partial reference of SUPER column is not supported in MERGE statement.

    有关 SUPER 类型的更多信息,请参阅 SUPER 类型

  • 对于包含 UPDATE 操作的 MERGE 语句,我们建议执行以下步骤以提高性能。

    • target_table 中的联接列定义为主键。

    • 使 UPDATE 操作更新 target_table 中的所有列。

    • 对于 UPDATE 和 INSERT 操作,使 expr 保持相同。

  • 如果主键列中有重复值,MERGE 可以删除重复值。这是可能的,因为 Amazon Redshift 不会强制实施主键约束。有关更多信息,请参阅定义表约束

    考虑以下示例:

    CREATE TABLE target (id INT, name CHAR(10), PRIMARY KEY(id)); CREATE TABLE source (id INT, name CHAR(10)); INSERT INTO target VALUES (101, 'Bob'), (101, 'John'), (102, 'Susan'); INSERT INTO source VALUES (101, 'Tony'), (103, 'Alice'); MERGE INTO target USING source ON target.id = source.id WHEN MATCHED THEN UPDATE SET id = source.id, name = source.name WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name); SELECT * FROM target; id | name -----+------------ 101 | Tony 102 | Susan 103 | Alice (3 rows)

    在 MERGE 语句之前,target_table 中有两个 ID 值都为 101 但具有不同名称值的独特行。在 MERGE 语句之后,只剩下一个 ID 为 101 的行。

  • 如果 source_table 很大,则将 target_tablesource_table 中的联接列定义为分配键可以提高性能。

示例

以下示例创建了两个表,然后对它们运行 MERGE 操作,更新目标表中的匹配行并插入不匹配的行。然后,它将另一个值插入源表并运行另一个 MERGE 操作,这次是删除匹配行并从源表插入新行。

首先创建并填充源表和目标表。

CREATE TABLE target (id INT, name CHAR(10)); CREATE TABLE source (id INT, name CHAR(10)); INSERT INTO target VALUES (101, 'Bob'), (102, 'John'), (103, 'Susan'); INSERT INTO source VALUES (102, 'Tony'), (103, 'Alice'), (104, 'Bill'); SELECT * FROM target; id | name -----+------------ 101 | Bob 102 | John 103 | Susan (3 rows) SELECT * FROM source; id | name -----+------------ 102 | Tony 103 | Alice 104 | Bill (3 rows)

接下来,将源表合并到目标表,用匹配行更新目标表,并插入源表中没有匹配的行。

MERGE INTO target USING source ON target.id = source.id WHEN MATCHED THEN UPDATE SET id = source.id, name = source.name WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name); SELECT * FROM target; id | name -----+------------ 101 | Bob 102 | Tony 103 | Alice 104 | Bill (4 rows)

请注意,ID 值为 102 和 103 的行已更新,以匹配目标表中的名称值。此外,在目标表中插入一个 ID 值为 104 且名称值为 Bill 的新行。

接下来,在源表中插入新行。

INSERT INTO source VALUES (105, 'David'); SELECT * FROM source; id | name -----+------------ 102 | Tony 103 | Alice 104 | Bill 105 | David (4 rows)

最后,运行合并操作,删除目标表中的匹配行,然后插入不匹配的行。

MERGE INTO target USING source ON target.id = source.id WHEN MATCHED THEN DELETE WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name); SELECT * FROM target; id | name -----+------------ 101 | Bob 105 | David (2 rows)

从目标表中删除 ID 值为 102、103 和 104 的行,并在目标表中插入 ID 值为 105 且名称值为 David 的新行。

另请参阅

INSERT, 更新, 删除