在 GreenPlum 中插入

Posted

技术标签:

【中文标题】在 GreenPlum 中插入【英文标题】:Upserting in GreenPlum 【发布时间】:2018-02-12 10:46:45 【问题描述】:

从 CSV 文件复制数据时,如何记录。对于给定的主键值,CSV 文件有多个记录。如果数据库中已经存在具有某个值的行,我想更新该记录。否则,它应该追加一个新行。

【问题讨论】:

简短的回答是删除然后插入。我很久以前写了一篇关于如何做的博客文章:pivotalguru.com/?p=104 【参考方案1】:

执行此操作的一种方法是将数据复制到临时表,然后从该表插入/更新。

这是一个例子:

-- Duplicate the definition of your table.
CREATE TEMP TABLE my_table_stage (LIKE my_table INCLUDING DEFAULTS);


-- Your COPY statment
COPY my_table FROM 'my_file.csv' ...


-- Insert any "new" records
INSERT INTO my_table (key_field, data_field1, data_field2)
SELECT
    stg.key_field,
    stg.data_field1,
    stg.data_field2
FROM
    my_table_stage stg
WHERE
    NOT EXISTS (SELECT 1 FROM my_table WHERE key_field = stg.key_field);


-- Update any existing records
UPDATE my_table orig
SET
    data_field1 = stg.data_field1,
    data_field2 = stg.data_field2
FROM
    my_table_stage stg
WHERE
    orig.key_field = stg.keyfield;

【讨论】:

从外部表而不是临时表中执行此操作怎么样? 外部表是什么意思? gpdb.docs.pivotal.io/520/admin_guide/external/… 好的,但这与您的问题有什么关系?这是您要问的另一个问题吗? 不,可以创建指向 CSV 的外部表,而不是创建临时表,并且可以按照您建议的方式将外部表中的数据插入到物理表中。这样就省去了创建临时表的一步。

以上是关于在 GreenPlum 中插入的主要内容,如果未能解决你的问题,请参考以下文章

GreenPlum - 带触发器的表 - 插入失败

将数据插入 Greenplum 物理表

Greenplum loader 不会将数据写入管道文件

使用 psql 和 centos7 进行任何搜索或插入操作时,greenplum 永远挂起

如何在 Greenplum/Postgres 中使用 PL/R 反序列化模型对象?

在 Greenplum 中使用触发器时出错