将CSV导入Postgres:更新&同时插入

时间:2017-05-31 07:46:36

标签: postgresql csv postgresql-9.6

所以我对Postgresql很新,并开始使用Postgres9.6上的pgadmin4测试一些东西。

问题:

我有一张表:test(id,text)

在此表中,我有10行数据。 现在我想导入一个包含12行的CSV来更新测试表。前10行中的某些文本已更改,我想从CSV中插入另外2行。

我知道您可以从表中截断所有数据,然后再从CSV导入所有数据,但这不是一个很好的方法。我想更新我现有的数据&使用一个查询插入新数据。

我已经找到了一个应该通过使用临时表来解决这个问题的函数。这会更新现有行的正确性,但不会插入另外2行

CREATE OR REPLACE FUNCTION upsert_test(integer,varchar) RETURNS VOID AS $$
DECLARE
BEGIN
    UPDATE test
SET id = tmp_table.id,
text = tmp_table.text
FROM tmp_table
WHERE test.id = tmp_table.id;
IF NOT FOUND THEN
INSERT INTO test(id,text) values 
(tmp_table.id,tmp_table.text);
END IF;
END;
$$ Language 'plpgsql';

DO $$ BEGIN
PERFORM upsert_test(id,text) FROM test;
END $$;

那么我需要更改什么才能使插入工作?

1 个答案:

答案 0 :(得分:5)

假设您在id列上有主要或唯一约束,您可以使用单个语句执行此操作,无需任何功能:

insert into test (id, text)
select id, text
from tmp_table
on conflict (id) 
  do update set text = excluded.text;