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)
那么我还需要更改以使插件工作?
假设您对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)