2017-02-22 11 views
0

Как говорится в названии, у меня есть столовая пища с полем food_id (PK) и food_name. У меня уже есть эти данные по таблицеОбновление вместо вставки того же первичного ключа при импорте с использованием запроса на копирование в postgresql с помощью pgadmin4

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 

, но я хочу, чтобы обновить food1 от яблока до яблока и вставить 0000004 | банан и 0000005 | виноград?

Возможно ли это?

ответ

1

Вы не можете сделать этого в одной команде COPY. Используйте временную таблицу и INSERT с ON 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

Я знаю, что это немного несвязанный, но как установить путь (d: \ testfood.csv), используя диалог открытия файла php или файл типа ввода? потому что браузер не может получить полный путь по какой-либо причине безопасности –