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

Sta*_*Ask 0 csv postgresql 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 $$;
Run Code Online (Sandbox Code Playgroud)

那么我还需要更改以使插件工作?

a_h*_*ame 6

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

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