如何复制IDENTITY字段?

时间:2013-11-06 20:51:28

标签: amazon-redshift

我想更新表的一些参数,例如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?

3 个答案:

答案 0 :(得分:19)

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

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

然后只需使用 COPY EXPLICIT_IDS中描述的 Loading default column values 参数:

  

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

  

如果目标表包含源中不存在的列   表,包括FILLTARGET。该命令填充了额外的列   源表具有默认列值或IDENTITY值,   如果定义了一个,或者为NULL。

它将列从一个表移动到另一个表,非常快,在dc1.large节点中为1GB表占用了4s。

  

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

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