2017-02-22 36 views
0

正如標題所說,我已經將食物放入了field food_id(PK)和food_name。 我已經在表當使用pgadmin4將副本查詢導入到postgresql時,更新插入相同的主鍵

food_id|food_name 
----------------- 
0000001|food1 
0000002|food2 
0000003|food3 

,並在我的CSV這個數據

0000001|apple 
0000004|banana 
0000005|grape 

這是我的查詢,如果沒有重複的PK

copy foodfrom 'd:\testingfood.csv' delimiter '|' csv 

,但我想更新的食物1蘋果到蘋果,然後插入0000004 |香蕉和0000005 |葡萄?

可能嗎?

回答

1

您不能在單個COPY命令中執行此操作。使用臨時表和INSERTON CONFLICT,例如:

create temp table tmp_food (like food); -- create temporary table like food 

copy tmp_food from 'd:\testingfood.csv' delimiter '|' csv; -- copy to temp table 

insert into food (food_id, food_name) -- insert into food from temp table 
select food_id, food_name 
from tmp_food 
on conflict (food_id) do    -- update instead of error 
update set food_name = excluded.food_name; 

drop table tmp_food;     -- drop temp table 
+0

的偉大工程,謝謝你......但有一兩件事,我要問你。臨時表和普通表有什麼區別?因爲你無論如何放棄它。 –

+0

臨時表保存在內存中,如果可用內存緩衝區足夠,則永遠不會寫入磁盤。小臨時表因此比普通表更有效率。另請閱讀[本文](http://stackoverflow.com/q/486154/1995738)。還有一個好處 - 他們不會被其他用戶看到。 – klin

+0

我知道這個我有點不相關,但是如何使用php打開文件對話框或輸入類型文件來設置路徑(d:\ testingfood.csv)?因爲某些安全原因,瀏覽器無法獲得完整路徑 –