8

我想更新表的一些参数,例如 dist 和 sort 键。为此,我重命名了旧版本的表,并使用新参数重新创建了表(一旦创建表就无法更改这些参数)。

我需要保留旧表中的 id 字段,这是一个 IDENTITY 字段。但是,如果我尝试以下查询,则会收到错误消息:

insert into edw.my_table_new select * from edw.my_table_old;
ERROR: cannot set an identity column to a value [SQL State=0A000] 

如何从旧表中保留相同的 id?

4

3 回答 3

21

您不能INSERT数据设置IDENTITY列,但您可以使用COPY命令从 S3 加载数据。

首先,您需要使用UNLOAD创建源表的转储。

然后只需使用COPYEXPLICIT_IDS参数,如加载默认列值中所述:

如果列列表中包含 IDENTITY 列,则还必须在 COPY 命令中指定 EXPLICIT_IDS 选项,否则 COPY 命令将失败。同样,如果从列列表中省略 IDENTITY 列,并且指定了 EXPLICIT_IDS 选项,则 COPY 操作将失败。

于 2013-11-07T06:44:05.210 回答
6

您可以显式指定列,并忽略标识列: insert into existing_table (col1, col2) select col1, col2 from another_table;

于 2016-09-04T21:24:53.703 回答
1

使用ALTER TABLE APPEND两次,第一次使用 IGNOREEXTRA,第二次使用 FILLTARGET。

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

它将列从一个表移动到另一个表,速度极快;dc1.large 节点中的 1GB 表花了我 4 秒的时间。

通过从现有源表中移动数据将行追加到目标表。
...
ALTER TABLE APPEND 通常比类似的 CREATE TABLE AS 或 INSERT INTO 操作快得多,因为数据是移动的,而不是重复的。

比使用 EXPLICIT_IDS 的 UNLOAD + COPY 更快、更简单。

于 2016-10-24T06:23:29.663 回答