2017-05-31 73 views
0

所以I'm相當新的PostgreSQL和開始通過與Postgres9.6 pgadmin4檢驗出來的一些東西與它的工作。導入CSV於Postgres:更新和插入的同時

問題:

我有一個表:試驗(ID,文本)

在此表中我有10行數據。 現在我想導入一個有12行的CSV來更新測試表。一些文字爲前10行更改,我想從CSV中插入2個附加行。

我知道,你可以從表中刪掉所有的數據和剛剛從CSV重新導入萬能的,但沒有that's一個很好的辦法做到這一點。我想更新我的現有數據&用一個查詢插入新數據。

我已經發現了應使用臨時表解決了這個功能。這更新現有的行是正確的,但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 $$; 

那麼我需要改變以獲得插入的工作?

+0

無關,而是:語言名稱是一個標識符。不要把它放在單引號使用:'語言plpgsql' –

回答

4

假設你對id列,你可以用一個語句做到這一點的主要或唯一約束,不需要功能:

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

是的,我試過了第一,但我總是得到錯誤:由子查詢 – StackAsk

+0

@StackAsk返回多行:那麼你使用一個不同的查詢。答案中的查詢不會導致該錯誤 –

+0

噢,是的,我的不好。工作很好。謝謝! – StackAsk