Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

ALTER TABLE APPEND

通过从现有的源表移动数据,将行附加到目标表。源表中的数据将移到目标表中的匹配列。列的顺序不重要。在成功将数据附加到目标表后,源表变成空表。由于是移动数据而不是复制数据,因此相比类似的 CREATE TABLE ASINSERT INTO 操作,ALTER TABLE APPEND 通常要快得多。

同名的列还必须具有相同的列属性。如果源表包含目标表中不存在的列(反之亦然),请使用 IGNOREEXTRA 或 FILLTARGET 参数来指定如何管理额外的列。

您不能附加身份列。如果两个表中均包括身份列,则命令会失败。如果只有一个表具有标识列,请包含 FILLTARGET 或 IGNOREXTRA 参数。有关更多信息,请参阅 ALTER TABLE APPEND 使用说明

源表和目标表必须均为永久表。如果一个表定义了分配方式和分配键,则两个表必须使用相同的分配方式和分配键。如果对表进行排序,则两个表必须使用相同的排序方式并定义相同的列作为排序键。

在操作完成之后,ALTER TABLE APPEND 会立即自动提交。该命令不能回滚。您不能在事务块 (BEGIN ... END) 中运行 ALTER TABLE APPEND。

语法

Copy
ALTER TABLE target_table_name APPEND FROM source_table_name [ IGNOREEXTRA | FILLTARGET ]

参数

target_table_name

要将行附加到的表的名称。只指定表的名称,或者通过格式 schema_name.table_name 使用特定架构。目标表必须是现有的永久表。

FROM source_table_name

提供要附加的行的表的名称。只指定表的名称,或者通过格式 schema_name.table_name 使用特定架构。源表必须是现有的永久表。

IGNOREEXTRA

这个关键字指定,如果源表中包含目标表中不存在的列,则应该放弃额外列中的数据。您不能将 IGNOREEXTRA 与 FILLTARGET 配合使用。

FILLTARGET

这个关键字指定,如果目标表中包含源表中不存在的列,则应该使用 DEFAULT 列值(如果已定义列值;否则使用 NULL 值)填充这些列。您不能将 IGNOREEXTRA 与 FILLTARGET 配合使用。

ALTER TABLE APPEND 使用说明

ALTER TABLE APPEND 仅将相同列从源表移到目标表。列的顺序不重要。

如果源表或目标表包含额外的列,则根据以下规则使用 FILLTARGET 或 IGNOREEXTRA:

  • 如果源表包含目标表中不存在的列,则包含 IGNOREEXTRA。该命令会忽略源表中额外的列。

  • 如果目标表包含源表中不存在的列,则包含 FILLTARGET。该命令使用默认列值或 IDENTITY 值(如果已定义列值;否则使用 NULL 值)填充源表中的额外列。

  • 如果源表和目标表均包含额外的列,则该命令失败。您不能同时使用 FILLTARGET 和 IGNOREEXTRA。

如果两个表中的某个列具有相同名称,但具有不同的属性,则该命令失败。名称类似的列必须具有以下共同的属性:

  • 数据类型

  • 列大小

  • 压缩编码

  • 非 Null

  • 排序方式

  • 排序键列

  • 分配方式

  • 分配键列

您不能附加身份列。如果源表和目标表中均具有身份列,则该命令失败。如果只有源表具有身份列,则包含 IGNOREEXTRA 参数以忽略身份列。如果只有目标表具有身份列,则包含 FILLTARGET 参数,以便根据为该表定义的 IDENTITY 子句来填充身份列。有关更多信息,请参阅 DEFAULT

ALTER TABLE APPEND 示例

假设您的组织维护表 SALES_MONTHLY 来获取当前销售交易。您希望每个月将数据从交易表移动到 SALES 表。

您可以使用下面的 INSERT INTO 和 TRUNCATE 命令来完成任务。

Copy
insert into sales (select * from sales_monthly); truncate sales_monthly;

不过,您可以使用 ALTER TABLE APPEND 命令执行相同的操作,而且效率要高得多。

首先,查询 PG_TABLE_DEF 系统目录表,验证两个表中包含具有相同列属性的相同列。

Copy
select trim(tablename) as table, "column", trim(type) as type, encoding, distkey, sortkey, "notnull" from pg_table_def where tablename like 'sales%'; table | column | type | encoding | distkey | sortkey | notnull -----------+------------+-----------------------------+----------+---------+---------+-------- sales | salesid | integer | lzo | false | 0 | true sales | listid | integer | none | true | 1 | true sales | sellerid | integer | none | false | 2 | true sales | buyerid | integer | lzo | false | 0 | true sales | eventid | integer | mostly16 | false | 0 | true sales | dateid | smallint | lzo | false | 0 | true sales | qtysold | smallint | mostly8 | false | 0 | true sales | pricepaid | numeric(8,2) | delta32k | false | 0 | false sales | commission | numeric(8,2) | delta32k | false | 0 | false sales | saletime | timestamp without time zone | lzo | false | 0 | false salesmonth | salesid | integer | lzo | false | 0 | true salesmonth | listid | integer | none | true | 1 | true salesmonth | sellerid | integer | none | false | 2 | true salesmonth | buyerid | integer | lzo | false | 0 | true salesmonth | eventid | integer | mostly16 | false | 0 | true salesmonth | dateid | smallint | lzo | false | 0 | true salesmonth | qtysold | smallint | mostly8 | false | 0 | true salesmonth | pricepaid | numeric(8,2) | delta32k | false | 0 | false salesmonth | commission | numeric(8,2) | delta32k | false | 0 | false salesmonth | saletime | timestamp without time zone | lzo | false | 0 | false

接下来,查看每个表的大小。

Copy
select count(*) from sales_monthly; count ------- 2000 (1 row) select count(*) from sales; count ------- 412,214 (1 row)

现在执行以下 ALTER TABLE APPEND 命令。

Copy
alter table sales append from sales_monthly;

再次查看每个表的大小。SALES_MONTHLY 表现在包含 0 行;而 SALES 表增长了 2000 行。

Copy
select count(*) from sales_monthly; count ------- 0 (1 row) select count(*) from sales; count ------- 414214 (1 row)

如果源表中的列多于目标表,请指定 IGNOREEXTRA 参数。以下示例使用 IGNOREEXTRA 参数,这样在附加到 SALES 表时,会忽略 SALES_LISTING 表中的额外列。

Copy
alter table sales append from sales_listing ignoreextra;

如果目标表中的列多于源表,请指定 FILLTARGET 参数。以下示例使用 FILLTARGET 参数,以填充 SALES_REPORT 表中存在而 SALES_MONTH 表中不存在的列。

Copy
alter table sales_report append from sales_month filltarget;

本页内容: