我想更新表的一些参数,例如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?
答案 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更快更简单。